我正在努力学习如何编写现代程序。我想将二进制数据存储在字符串中,然后输出它。为什么?例如,我希望将整个文件读取为一个字符串,然后将其输出到stdout。
我该怎么做呢?并将停止输出数据放在第一个\0之后
我应该用什么来存储文件名,这样我才能使用国际字符?wchar_t?
发布于 2018-02-21 08:11:13
假设你有一个二进制文件。假设您想从文件中读取8个字节。
FILE *fp = fopen("a", "rb");
if(fp == NULL)
return;
unsigned char bytes[8];
if(fread(bytes, sizeof bytes / sizeof *bytes, 1, fp) != 1)
{
fprintf(stderr, "could not read 8 bytes\n");
return;
}
// printing the bytes:
for(size_t i = 0; i < sizeof bytes / sizeof *bytes; ++i)
printf("%02X ", bytes[i]);
puts("");
fclose(fp);
我运行这段代码,读取这段代码的编译后的二进制文件(文件名是a
),前8个字节是:
7F 45 4C 46 02 01 01 00
正如您所看到的,有些字节没有表示形式,如果我将其打印为字符串,结果将是:
这不太有用,在这里我很幸运,至少有可打印的整数。
如果您还想打印可打印的字符(就像十六进制编辑器一样):
size_t n;
// yes I swapped the number of items and the number of bytes here
// for reading the whole file
while((n = fread(bytes, 1, sizeof bytes / sizeof *bytes, fp)))
{
size_t i;
for(i = 0; i < n; ++i)
printf("%02X ", bytes[i]);
// if less than array size bytes read, to align output
printf("%*s", (int) ((sizeof bytes / sizeof *bytes) - i)*3, "");
printf("%10s |", "");
for(i = 0; i < n; ++i)
{
if(isprint(bytes[i]))
printf("%c", bytes[i]);
else
printf(".");
}
// same here as above
printf("%*s", (int) ((sizeof bytes / sizeof *bytes) - i), "");
puts("|");
}
这将输出以下内容:
7F 45 4C 46 02 01 01 00 |.ELF....|
00 00 00 00 00 00 00 00 |........|
03 00 3E 00 01 00 00 00 |..>.....|
A0 07 00 00 00 00 00 00 |........|
40 00 00 00 00 00 00 00 |@.......|
F0 23 00 00 00 00 00 00 |.#......|
00 00 00 00 40 00 38 00 |....@.8.|
09 00 40 00 23 00 22 00 |..@.#.".|
...
00 6C 69 62 63 2E 73 6F |.libc.so|
2E 36 00 66 6F 70 65 6E |.6.fopen|
00 70 75 74 73 00 5F 5F |.puts.__|
73 74 61 63 6B 5F 63 68 |stack_ch|
6B 5F 66 61 69 6C 00 70 |k_fail.p|
75 74 63 68 61 72 00 70 |utchar.p|
72 69 6E 74 66 00 66 63 |rintf.fc|
6C 6F 73 65 00 5F 5F 63 |lose.__c|
74 79 70 65 5F 62 5F 6C |type_b_l|
...
39 01 00 00 00 00 00 00 |9.......|
00 00 00 00 00 00 00 00 |........|
01 00 00 00 00 00 00 00 |........|
00 00 00 00 00 00 00 00 |........|
https://stackoverflow.com/questions/48896082
复制相似问题