问题将缓冲区转换为 c 中的十六进制字符串
the issue convert buffer to hex string in c
我正在尝试将缓冲区转换为 c 中的十六进制字符串,如下所示,
下图是输入文件
这是一个二进制文件。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "fcntl.h"
#if defined(_MSC_VER)
#include <BaseTsd.h>
typedef SSIZE_T ssize_t;
#endif
#define BUFF_SIZE 5
int main()
{
char buff[BUFF_SIZE];
int fd;
ssize_t rd_size;
FILE *rfp;
FILE *ofp;
ofp = fopen("output.txt", "w");
rfp = fopen("test.bin", "rb");
while ( 4== (fread(buff, 1, 4, rfp)))
{
fprintf(ofp, "%02X%02X%02X%02X \n", buff[0], buff[1], buff[2], buff[3]);
}
fclose(ofp);
fclose(rfp);
return 0;
}
然后我使用上面的代码,我得到了 bin 到 hex 文件
但结果我遇到了问题。
04002B2B
000001FFFFFFFF
00030003
00000000
00000000
00000000
00000300
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00500050
00500050
00500050
00500050
00000000
FFFFFF80002000
00000000
08700F00
00000000
00000000
00000001
00000002
00000003
00000004
00000005
00000006
00000007
FFFFFF800FFFFFFFF01E
087007FFFFFF80
00320032
0BFFFFFFB80820
00050005
2DFFFFFFC7114D
00FFFFFFC20118
00001B58
如你所见,上面的文件,尤其是我不想“000001FFFFFFFF”这个输出。但是我不知道我该怎么办
更新
我要运行中linux。但是如果我制作一个执行文件,我会得到 segmant 错误。
你能告诉我我该怎么办吗?
这里的主要问题是您的 char
类型似乎是 signed
(如果 char
是 signed
或 unsigned
是特定于实现的)。这意味着大于等于或大于 0x80
的值将被视为负值(对于 two's complement 系统)。
并且当您将这样的值传递给 printf
并且值是 promoted 到 int
时,它是符号扩展的。所以 0xff
变成 0xffffffff
,然后打印出来。
如果您使用 unsigned char
作为您的值,则 0xff
等值在提升为 unsigned int
时不会扩展。所以 0xff
被提升为 0x000000ff
,并且不打印前导零。
另一个问题是您为 printf
使用了错误的格式。格式 "%x"
适用于 unsigned int
而不是 unsigned char
。如果您阅读例如this printf
(and family) reference 您会看到一个很大的 table,其中包含所有格式代码和不同类型的不同大小前缀。要打印 unsigned char
,您应该使用 hh
前缀,如 "%hhx"
.
我正在尝试将缓冲区转换为 c 中的十六进制字符串,如下所示,
下图是输入文件
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "fcntl.h"
#if defined(_MSC_VER)
#include <BaseTsd.h>
typedef SSIZE_T ssize_t;
#endif
#define BUFF_SIZE 5
int main()
{
char buff[BUFF_SIZE];
int fd;
ssize_t rd_size;
FILE *rfp;
FILE *ofp;
ofp = fopen("output.txt", "w");
rfp = fopen("test.bin", "rb");
while ( 4== (fread(buff, 1, 4, rfp)))
{
fprintf(ofp, "%02X%02X%02X%02X \n", buff[0], buff[1], buff[2], buff[3]);
}
fclose(ofp);
fclose(rfp);
return 0;
}
然后我使用上面的代码,我得到了 bin 到 hex 文件 但结果我遇到了问题。
04002B2B
000001FFFFFFFF
00030003
00000000
00000000
00000000
00000300
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00500050
00500050
00500050
00500050
00000000
FFFFFF80002000
00000000
08700F00
00000000
00000000
00000001
00000002
00000003
00000004
00000005
00000006
00000007
FFFFFF800FFFFFFFF01E
087007FFFFFF80
00320032
0BFFFFFFB80820
00050005
2DFFFFFFC7114D
00FFFFFFC20118
00001B58
如你所见,上面的文件,尤其是我不想“000001FFFFFFFF”这个输出。但是我不知道我该怎么办
更新
我要运行中linux。但是如果我制作一个执行文件,我会得到 segmant 错误。 你能告诉我我该怎么办吗?
这里的主要问题是您的 char
类型似乎是 signed
(如果 char
是 signed
或 unsigned
是特定于实现的)。这意味着大于等于或大于 0x80
的值将被视为负值(对于 two's complement 系统)。
并且当您将这样的值传递给 printf
并且值是 promoted 到 int
时,它是符号扩展的。所以 0xff
变成 0xffffffff
,然后打印出来。
如果您使用 unsigned char
作为您的值,则 0xff
等值在提升为 unsigned int
时不会扩展。所以 0xff
被提升为 0x000000ff
,并且不打印前导零。
另一个问题是您为 printf
使用了错误的格式。格式 "%x"
适用于 unsigned int
而不是 unsigned char
。如果您阅读例如this printf
(and family) reference 您会看到一个很大的 table,其中包含所有格式代码和不同类型的不同大小前缀。要打印 unsigned char
,您应该使用 hh
前缀,如 "%hhx"
.