以二进制形式打印文件(1和0)

时间:2012-07-20 12:54:00

标签: c bash hexdump

在GZip解码器的上下文中,我需要一个unix工具或C解决方案,以二进制形式在我的屏幕上打印压缩的gzip文件。我真正需要的是hexdump能够以二进制而不是八进制,十进制或十六进制打印。

我很确定这个工具存在,但我找不到它: - (

修改 我想这样的编辑器很难找到,因为用例不能频繁。在我的情况下,我有非常小的文件,需要调试目的来搜索二进制“模式”,如10010011可能跨越几个字节

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

因为Manuel告诉我转发,我完成了我上次写的评论,这是电话:

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::'

答案 2 :(得分:0)

从我做的另一个答案(遗憾的是我现在找不到)我有这个功能打印int作为二进制数字:

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

您可以将文件作为整数读取,并使用此功能将值打印为二进制数字。

答案 3 :(得分:0)

您的编译器可以支持此实用程序函数ltoa

char * ltoa(long value,char * buffer,int radix);

可以使用radix = 2

简化显示

答案 4 :(得分: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] '

答案 5 :(得分: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 filename'

答案 6 :(得分: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 "" }
    '