2012-07-20 96 views
0

在一個gzip解碼器的上下文中,我需要一個Unix工具或C溶液以打印我的壓縮gzip文件我的屏幕上以二進制形式。我確實需要的是hexdump能夠以二進制而不是八進制,十進制或十六進制打印。打印在二進制形式的文件(1和0)

我敢肯定這個工具存在,但我不能找到它:-(

編輯 我想這樣的編輯是很難找到的,因爲使用的情況下絕不能頻繁。在我的情況我有非常小文件和需要調試的目的來搜索二進制的「模式」,如10010011可能跨越幾個字節

+0

如果你搜索多字節模式,你可能想要一個解決方案,不強制線換行到流? – moooeeeep 2012-07-20 13:08:14

+0

看到這個:http://stackoverflow.com/questions/111928/is-there-a-printf-converter-to-print-in-binary-format – qwertz 2012-07-20 13:13:36

回答

2
perl -ne 'print unpack(B8,$_),$/for split//' FILE 

,或者具有在第8個元件

perl -ne 'print unpack(B8,$_),++$i%8?" ":"\n"for split//;END{print"\n"}' 

不換行

perl -ne 'print unpack(B8,$_)for split//' FILE 
+0

完美!沒有換行符,我應該如何修改? – 2012-07-20 14:25:23

0

從另外一個答案,我(是我很遺憾現在不能找到),我有這個功能,打印一個int作爲二進制數字:

void print_bin(int n) 
{ 
    for (int i = sizeof(n) * 8 - 1; i >= 0; i--) 
     printf("%d", (int) ((n >> i) & 1)); 
} 

您可以讀取該文件爲整數,利用此功能來打印值二進制數字。

+0

感謝您的提示。如果這樣的heditor不存在,我會寫一個從這個開始的小工具。 – 2012-07-20 13:03:31

+0

int(((n >> i)&1))是什麼意思?它不爲我編譯? – 2012-07-20 13:23:39

+0

@ManuelSelva啊,我原來是在一個C++程序中使用它,現在編輯成C風格的。 – 2012-07-20 13:26:28

0

你的編譯器可以支持這種效用函數ltoa

的char * LTOA(long值,字符*緩衝區,詮釋基數);

,可以簡化與基數顯示器= 2

0
od -t x1 FILE | sed 's:0:0000:g;s:1:0001:g;\ 
s:2:0010:g;s:3:0011; 
...[replace every hex-digit up to F with the bin representation] ' 
+0

該命令的語法不是goo。你可以修復它,這正是我所需要的 – 2012-07-20 13:35:15

0

只寫一個小程序:

#include <stdio.h> 

void binarywrite (unsigned char c) 
{ 
    int i = 0; 
    for (i = 0; i < 8; i++) 
    { 
     printf("%1d",(c>>(7-i)) & 1); 
    } 
    printf(" "); 
} 

int main(int argc, char* argv[]) 
{ 
    char c = 0; 

    if(argc >=2) 
    { 
     char* pfilename = argv[1]; 
     FILE *fp; 
     fp = fopen(pfilename,"rb"); 
     char ch; 
     while((ch = getc(fp)) != EOF) 
     { 
      binarywrite(ch); 
     } 
     fclose(fp); 
    } 

    return 0; 
} 

而且你可以把它當作 './binarywite文件名'

+0

謝謝你的答案。但爲什麼我不想這樣做是因爲您的解決方案沒有打印出與另一個答案中提出的其他C手編解決方案相同的結果;-) – 2012-07-20 14:10:22

1

因爲曼努埃爾告訴我轉貼,我完成了我寫的最後一次解說,這裏是呼叫:

od -t x1 FILE | sed 'h;x;s:^\(........\).*:\1:;x;s:^........::;s:0:0000:g;s:1:0001:g;s:2:0010:g;s:3:0011:g;s:4:0100:g;s:5:0101:g;s:6:0110:g;s:7:0111:g;s:8:1000:g;s:9:1001:g;s:a:1010:g;s:b:1011:g;s:c:1100:g;s:d:1101:g;s:e:1110:g;s:f:1111:g;H;x;s:\n::' 
+0

謝謝,不要因爲我對sed的無知而責備我;-) – 2012-07-20 17:15:14

0

XXD(通常帶有vim)可以直接轉換爲二進制表示:

xxd -b FILE 

要切斷格式化輸出的時候,可以附加一點awk,這樣你只能得到一個乾淨的零和零流:

xxd -b FILE | \ 
    awk '{ for (i=0; i<NF; i=i+1) 
      { if ($i ~ /^[01][01][01][01][01][01][01][01]$/) printf $i } 
     }; END { print "" } 
    '