[英]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.