我试图逐字节读取文件,然后使用C将其打印出来,但是输出与十六进制编辑器的显示不匹配。
在十六进制编辑器中,前两行如下所示:
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0111 1111 1000 0000 0000
预期输出:
00000000000000000000000000000000
00000000000001111111100000000000
但是当我的代码输出以下内容时:
00000000000000000000001111111100
00000000000000000000000000000000
这是我的代码:
#include <stdio.h>
#include <string.h>
int main() {
FILE *fp;
unsigned char buffer[4900] = "";
int y;
y = 0;
fp = fopen("tugasz.ksa", "rb");
for (int x = 0; x < 4900; x++) {
fread(buffer, 1, 4900, fp);
printf("%x", buffer[x]);
}
return (0);
}
答案 0 :(得分:2)
您的代码中存在多个问题:
fopen
是否失败,如果文件不存在或无法打开,则会导致不确定的行为。%x
每字节输出1或2个字符,具体取决于字节值。这是一个问题,因为文件内容分别是0x00
,0x01
,{{}的0x10
,0x11
,0
和1
1}}和10
,因此显然是未对齐的输入。11
溪流。这是一种更简单的方法:
fclose
答案 1 :(得分:0)
for(int x = 0; x<4900; x++) { fread(buffer, 1, 4900, fp); printf("%x", buffer[x]); }
在循环的第一次迭代中,这只会在buffer
中以索引0打印第一个字符。
在第二次迭代中,这将在索引{1的buffer
中打印第二个字符。
因此,如果您的文件少于4900字节,则仅打印1个字符。您获得更多输出的原因是因为到达文件末尾时循环不会中断。它主要打印垃圾,而不是实际的文件内容。
鉴于输入文件的十六进制视图,并且期望输出全为0和1,因此源文件不太可能是由0和1组成的字节的集合。相反,它可能包含字节从0到256,每个字节都是0和1位的集合。打印如下:
int main(void)
{
FILE *fp = fopen("tugasz.ksa", "rb");
if(fp)
{
unsigned char buffer[4096];
size_t sz;
int line = 0;
while ((sz = fread(buffer, 1, sizeof(buffer), fp)) > 0)
{
for(int i = 0; i < sz; i++)
{
//print the bits of the byte, at buffer[i]:
for(int j = 0; j < 8; j++)
{
int mask = 1 << (7 - j);
int bit = buffer[i] & mask;
printf("%d", bit ? 1 : 0);
}
//add new line for every 4 byte
line++;
if((line % 4) == 0)
printf("\n");
}
}
}
return 0;
}
如果字节是0和1,则只需将其打印为printf("%d", buffer[i])
或printf("%02X", buffer[i])
以获得字节值:
int main(void)
{
FILE *fp = fopen("tugasz.ksa", "rb");
if(fp)
{
unsigned char buffer[4096];
size_t sz;
while((sz = fread(buffer, 1, sizeof(buffer), fp)) > 0)
{
for(int i = 0; i < sz; i++)
printf("%d", buffer[i]);
//or use "%02X" instead, for printing the byte values:
//printf("%02X ", buffer[i]);
}
}
return 0;
}