2016-08-22 81 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 ...」等。 接下來,我要改變這樣的二進制文件的幾個字節和編碼這:(