我想写一个hexdump函数。因此,我想使用带有格式字符串的sprintf,如
"%c %c %c %c 0x%02X 0x%02X 0x%02X 0x%02X"
然后在printf()中使用带有字符(或字节)的字符串。
但是,我希望用户指定行宽,即每行要转储的字节数。
如何构造具有给定宽度的格式字符串,即宽度为2会导致格式字符串为"%c %c 0x%02X 0x%02X"
...
答案 0 :(得分:1)
我建议这样做:
我建议这样做:
void writeIntegersAsChar(char* str, int* source, int N)
{
int i;
for(i = 0; i < N; i ++)
{
sprintf(str + i, "%c", source[i]);
}
}
答案 1 :(得分:1)
不要使用sprintf()
构建格式字符串,而只是稍后使用printf()
,请考虑以下方法(基本上)对输入字符串进行两次传递:
void hex_dump(char *bytes, size_t bytes_len)
{
const int DUMP_WIDTH = 16;
for (int i = 0; i < bytes_len; i += DUMP_WIDTH)
{
for (int j = 0; j < DUMP_WIDTH; ++j)
{
if (i + j >= bytes_len) {
printf(" ");
continue;
}
char ch = bytes[i + j];
if (isprint(ch))
{
printf("%c", ch);
}
else
{
printf(".");
}
}
printf(" ");
for (int j = 0; j < DUMP_WIDTH && i + j < bytes_len; ++j)
{
printf("0x%02x", bytes[i + j]);
printf(" ");
}
printf("\n");
}
}
该函数将输出hexdump
- 类似于DUMP_WIDTH
常量控制的输出。此外,输出正确对齐。
答案 2 :(得分:1)
构造这样的格式字符串相当容易。
然而,问题是使用该格式调用sprintf 。 <stdio.h>
中没有允许您传入数组参数的函数。标准C中的每个printf
变体都要求您在编译时决定参数的数量。
虽然可以传入 less 参数,但它并不能帮助您使用组合的十六进制显示,例如
"%c %c %c %c 0x%02X 0x%02X 0x%02X 0x%02X"
很快就会变得乏味。
不幸的是,没有简单的方法 - 您需要编写自己的 sprintf 变体,或者使用循环代替。