我在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 非常感谢回复答案!
答案 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 ......”等 接下来我必须将这个二进制文件更改为几个字节并对其进行编码:(