问题在c中将缓冲区转换为十六进制字符串

时间:2016-12-21 09:12:26

标签: c gcc-warning

我正在尝试将缓冲区转换为c中的十六进制字符串,如下所示, 下图是输入文件 enter image description here 这是一个二进制文件。

#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错误。 你能让我知道我应该做什么吗?

1 个答案:

答案 0 :(得分:2)

这里的主要问题是,您的char类型似乎是signed(如果charsignedunsigned是特定于实施的)。这意味着大于等于或大于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您将看到一个包含所有格式代码和不同类型的不同大小前缀的大表。要打印unsigned char,您应该使用hh前缀,例如"%hhx"