2016-08-22 83 views
1

我的程序在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 非常感谢您的回复!

回答

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]  
+0

$ UP:编辑自己的帖子 – Mdr92

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 ...”等。 接下来,我要改变这样的二进制文件的几个字节和编码这:(