2012-07-20 98 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 "" } 
    '