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

标签 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 错误。 你能告诉我我应该做什么吗?

最佳答案

这里的主要问题是您的char 类型似乎是signed(如果charsignedunsigned 是特定于实现的)。这意味着大于等于或大于 0x80 的值将被视为负值(使用 two's complement 系统)。

当您将这样的值传递给 printf 并且值为 promoted 时到 int 它是符号扩展的。所以 0xff 变成 0xffffffff,然后打印出来。

如果您改为使用 unsigned char 作为您的值,则在提升为 unsigned int 时不会扩展像 0xff 这样的值。所以 0xff 被提升为 0x000000ff,并且不打印前导零。


另一个问题是您为 printf 使用了错误的格式。 "%x" 格式适用于 unsigned int 而不是 unsigned char。如果您阅读例如this printf (and family) reference您将看到一个大表格,其中包含所有格式代码和不同类型的不同大小前缀。要打印 unsigned char,您应该使用 hh 前缀,如 "%hhx"

关于c - 问题将缓冲区转换为 c 中的十六进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41258963/

相关文章:

C:不会创建.eh_frame_hdr表

c - 32 位和 64 位机器中的位操作

c - 带有 gcc 编译器的 UDP recvfrom 警告

你能帮我了解 fopen ("contact.dll"、 "r");

c - 奇怪的段错误,可能与 realloc 有关

c - GCC 不再实现 <varargs.h>

ios - 警告 : "implicit declaration of function ' .。 .' is invalid in C99"

c - 警告 "format not a string literal and no format arguments"未出现在最新的 gcc 版本中

c - 尝试在我的程序中使用 libcurl 并出现 "undefined reference"错误

c++ - 在没有手动分配缓冲区的情况下使用 sprintf