2016-08-22 1 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, используйте base64 package в Tcllib.

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

Спасибо за ответ.

В этом бен файле у меня есть символы «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 ...» и т.д. . Далее я должен изменить эти двоичные файлы на несколько байтов и закодировать это :(

Смежные вопросы