Is it possible to redirect commands using binary data for input and output?

If so how can one achieve this?

---

Example: binary file (a graphic), size 976 can be processed with this Rexx 
filter program
"readbinary.rex":

    allchars=readall()        -- read from stdin using charin()
    .output~charout(allchars) -- write binary

    ::routine readall
      mb=.mutableBuffer~new
      signal on notready

      do counter i forever
         mb~append(.input~charin) -- supplying a length does not work
      end

    notready:
      .error~say(i "charin reads")  -- in this sample yields: "977 charin reads"
      return mb~string

Running the above program with "readbinary.rex < image.png > output.png" works, 
the resulting file
is identical to the original one.

---

Trying to fetch the binary data with redirecting .output to an .array breaks up 
the binary data and
swallows CR-LF characters it seems, e.g.:

    out=.array~new
    cmd="readbinary.rex < in\bsf4oorexx_016.png "
    say "cmd:" cmd
    address system cmd with output using (out)
    say "out~items:" out~items
    sum=0
    do counter i data over out
       sum += data~length
       say "#" i":" edit(data)
    end

    .error~say("test2.rex: sum="sum)

    ::routine edit
      parse arg data

      str1="length=["|| (data~length)~right(4)"]"
      str1=str1 data~left(min(3,data~length))~c2x~left(6) "|"

      if data~length>3 then
          str1=str1 "right(3)~c2x:" data~right(min(3,data~length))~c2x~left(6)
      else
      do
         len=data~length-3
         if len>0 then
            str1=str1 "right("len")~c2x:" data~right(min(3,len))~c2x~left(len*2)
      end
      return str1

In my test case this results in eight array items, and adding up the eight 
chunks is eight
characters short compared to the original. Here the output:

    G:\test\oorexx\redirect>test2
    cmd: readbinary.rex < in\bsf4oorexx_016.png
    977 charin reads
    --->
    
89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF61000003974944415478DA4D936D6C53651886EFF7B4A767A7675DCB76D6F6281B04C73
    
6666580637E30995F307F8C1F10C090684C8C46C948FC831A2526447F982846D1CC294403314CD998A213AB9B83B10D261A452CD2B18F6EEBBAB6EBFABDF5F4F39CE329
    
29C437B9F224CFFBBC77F23EB96F82C25194F31AB5702A6695BBF335329BB6DCEC9F78686AF84AD55232E6BEEFB9AD97EA9B6D3EBD5EE7A528CAA7CE84C8FF047492833
    
4C9E3AE77820BEE8DA246A1E30B29B8A67DD9A5409099F7B889B98A975A9EBADF49B73E7C84E74BDC34AD9DBF2390EBB73F9FBA30D0E12461CAB4BB412BBA72983C338A
    
E0821F04125C0137529B56635B99193506665CF742EBBB66B3C97D4B20DBD7D79239D36DFF830AA6F9B6478B4A743C5C1F0DE1A66B0AA488401B4A603CE487A5750B569
    
6B2305E9ECC89D6E25EDB6B7BED44191E2E53D89999B495E3321C4D14686018F4E2EB8E6F20B204B9C412921111114941FDF626A4E76611BEEE9293D178ACF4959D5F10
    
D977EE8A6F31D478F1DAAC52B28225F5B66A08B2163FB6772332E5413012458052C0180CA8B158A111534878BC4A389B22630AFA883474DC1B1338E1A537BB70EA541B0
    
EEC3F8AF70EB7E1BBCE5FE0199FC6355544A635B0AD1260F12E83613930EA4EA6265CC808A62491FE39911BF2C4C8D163BDD4F66DF782058D7DFB5A70E4D3B3D8B2B906
    
F1641283E7FFC25AC104C37400E1313F38BD1E0A91E1F0F963449AEF513EFCEAA242E834191D75E274FBAB985C08A3B367100D0DEBB0F5914D387776045AF51BAB4C2C2
    
E74FC00D113458950A64CA4C4189918ED901EDFF316F5F1270770F2643F5E7F71077EFDDD09319385D95C0A8666D0B4BE1A3F5DFA1B2B2B2CC8BA7C18E91A80A4A3156B
    
635D8CC8735D628AA58BA8629AA8C680727506A9CA72D0460E5AAD0624964536BA0C452807A134C82C26E5C56088F89713F1CBBF5DFF9E78386EFF7CF55DEF177DF934B
    
77A4D3934DD7FE2DFCF46C01E7B0655211ED15D6F60EC502BB8C76A5197A8CCA4DF6ED7D92BF8D3D36B2B1C3CBFC243EA54FF7F5B2D0CC83B1A1F287DF941B04606E2A1
    
7E754926A07710B3CF6E86F4442D6A02463973F8736A408713BDB635F6CA4A73B0B979FD2D27521B01FE8327D7751A054BA3DE6CD1246ECC25020E678CB298AC86FA5A9
    
A5E1433C1AB8EC99FE3C9E33D06EE86D1581CDFB0E11EEFC1837BE3B7B3A0553114C8A79256D1AB30F99CA9A454A4C2ACA8125659CEF7EE84A9F0902988512AB7EF9442
    250591743E3E2A72BEF91FA6218819E1AB32C90000000049454E44AE426082
    <---
    out~items: 8
    # 1: length=[   4] 89504E | right(3)~c2x: 504E47
    # 2: length=[   1] 1A     |
    # 3: length=[ 300] 000000 | right(3)~c2x: 6DFF83
    # 4: length=[  14] A6F9B6 | right(3)~c2x: E1A66B
    # 5: length=[ 131] A48840 | right(3)~c2x: 9B2263
    # 6: length=[ 103] FA8834 | right(3)~c2x: 38BD1E
    # 7: length=[  90] 91E1F0 | right(3)~c2x: 85D95C
    # 8: length=[ 325] 8666D0 | right(3)~c2x: 426082
    test2.rex: sum=968

It seems that in the redirection case CR and LF cause the data to be split (and 
eating up those
control characters).

---rony



_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to