在 GZip 解码器的上下文中,我需要一个 unix 工具或 C 解决方案来以二进制形式在我的屏幕上打印我的压缩 gzip 文件。我真正需要的是能够以二进制而不是八进制、十进制或十六进制打印的 hexdump。
我很确定这个工具存在但我找不到它:-(
编辑 我想这样的编辑器很难找到,因为用例不能很频繁。就我而言,我的文件非常小,需要出于调试目的来搜索二进制“模式”,例如可能跨越多个字节的 10010011
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
因为 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::'
只需编写一个小程序:
#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 文件名”
从我做出的另一个答案(不幸的是,我现在找不到)我有这个功能来打印int
二进制数字:
void print_bin(int n)
{
for (int i = sizeof(n) * 8 - 1; i >= 0; i--)
printf("%d", (int) ((n >> i) & 1));
}
您可以将文件读取为整数,并使用此函数将值打印为二进制数字。
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] '
xxd(通常与 vim 一起提供)可以直接转换为二进制表示:
xxd -b FILE
为了切断输出的格式,可以附加一点 awk ,这样你就可以得到一个干净的 0 和 1 流:
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 "" }
'