从bin文件读取并在TCL

时间:2016-08-22 13:06:03

标签: tcl bin

我在tcl中的程序有问题。

我需要从我的文件test.bin读取数据然后我必须从这个文件中获取字节并显示输出..第二个函数将以字节为单位读取此数据输出并将此数据放入帧中。帧i中的所有数据必须在base64中编码并显示到output2。

我曾经:

proc b64en str {
    binary scan $str B* bits
    switch [expr {[string length $bits]%6}] {
        0 {set tail {}}
        2 {append bits 0000; set tail ==}
        4 {append bits 00; set tail =}
    }
    return [string map {
        000000 A 000001 B 000010 C 000011 D 000100 E 000101 F
        000110 G 000111 H 001000 I 001001 J 001010 K 001011 L
        001100 M 001101 N 001110 O 001111 P 010000 Q 010001 R
        010010 S 010011 T 010100 U 010101 V 010110 W 010111 X
        011000 Y 011001 Z 011010 a 011011 b 011100 c 011101 d
        011110 e 011111 f 100000 g 100001 h 100010 i 100011 j
        100100 k 100101 l 100110 m 100111 n 101000 o 101001 p
        101010 q 101011 r 101100 s 101101 t 101110 u 101111 v
        110000 w 110001 x 110010 y 110011 z 110100 0 110101 1
        110110 2 110111 3 111000 4 111001 5 111010 6 111011 7
        111100 8 111101 9 111110 + 111111 /
    } $bits]$tail
}

但我有错误:

"Expected binary string but got: 0000001010101001010101... etc."

我添加了我的test.bin文件。 enter link description here 非常感谢回复答案!

2 个答案:

答案 0 :(得分:0)

Tcl 8.6带有base64编码器和解码器。

binary encode base64 $str

为方便起见,您甚至可以将其包裹起来:

binary encode base64 -wraplen 60 $str

如果您使用的是旧版Tcl,请使用Tcllib中的base64 package

package require base64
::base64::encode $str

如果您在编码之前从文件中提取数据,请确保在读取之前将通道置于二进制模式。这是因为base64编码定义为对字节进行操作。

Tcl 8.6版本:

set f [open $thefilename "rb"]
set data [read $f]
close $f
set b64data [binary encode base64 $data]

Tcl 8.4 / 8.5版本(也应该在8.6中工作,但更长):

package require base64

set f [open $thefilename "r"]
fconfigure $f -translation binary
set data [read $f]
close $f
set b64data [::base64::encode $data]    

答案 1 :(得分:0)

感谢您的回复。

在这个bin文件中我有字符“A73572BPWOFHSA21”,当我想解码时:

proc b64de {str} {
    set tail [expr [string length $str] - [string length [string trimright $str =]]]
    set str [string trimright $str =]
    set bits [string map {
        A 000000 B 000001 C 000010 D 000011 E 000100 F 000101
        G 000110 H 000111 I 001000 J 001001 K 001010 L 001011
        M 001100 N 001101 O 001110 P 001111 Q 010000 R 010001
        S 010010 T 010011 U 010100 V 010101 W 010110 X 010111
        Y 011000 Z 011001 a 011010 b 011011 c 011100 d 011101
        e 011110 f 011111 g 100000 h 100001 i 100010 j 100011
        k 100100 l 100101 m 100110 n 100111 o 101000 p 101001
        q 101010 r 101011 s 101100 t 101101 u 101110 v 101111
        w 110000 x 110001 y 110010 z 110011 0 110100 1 110101
        2 110110 3 110111 4 111000 5 111001 6 111010 7 111011
        8 111100 9 111101 + 111110 / 111111
    } $str]
    set bytes [binary format B* $bits]
    return [string range $bytes 0 end-$tail]
}

我收到一条消息:“预期的二进制字符串但得到了:00000010101010101001010111 ......”等 接下来我必须将这个二进制文件更改为几个字节并对其进行编码:(