簡體   English   中英

問題將緩沖區轉換為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放入了十六進制文件,但是結果出了問題。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM