[英]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放入了十六进制文件,但是结果出了问题。
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
值将被视为负值(使用二进制补码系统)。
并且,当您将这样的值传递给printf
并将该值提升为int
它将被符号扩展。 因此0xff
变为0xffffffff
,然后将其打印出来。
如果改为使用unsigned char
作为值,则当提升为unsigned int
时,不会扩展0xff
类的值。 因此,将0xff
提升为0x000000ff
,并且不打印前导零。
另一个问题是您为printf
使用了错误的格式。 格式"%x"
用于unsigned int
而非unsigned char
。 如果您阅读此printf
(和系列)参考,您将看到一个大表,其中包含所有格式代码和不同类型的不同大小前缀。 要打印unsigned char
,应使用hh
前缀,如"%hhx"
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.