簡體   English   中英

為什么C中字符串轉十六進制需要用0xff完成?

[英]Why does converting string to hex need to be done with 0xff in C?

在這個問題之后如何在 c 中將字符串轉換為十六進制,反之亦然?

我運行以下代碼:

#include <stdio.h>

int main (int argc, char *argv[])
{
    char str[] = { 0x58, 0x01, 0x02, 0x20, 0x22, 0x00, 0xC5};
    char hex[32] = {0}, hex2[32] = {0};

    for (int i = 0; i < sizeof(str); i++) {
        sprintf(hex + i*2, "%02X", str[i]);
    }

    for (int i = 0; i < sizeof(str); i++) {
        sprintf(hex2 + i*2, "%02X", str[i] & 0xff);
    }

    printf("hex = %s\nhex2 = %s\n", hex, hex2);
    return 0;
}

我得到這個結果:

hex = 580102202200FFFFFFC5
hex2 = 580102202200C5

我想知道為什么沒有 0xFF 會有更多的FFFFFF

拼圖中有許多小塊需要拼湊起來。

首先,如果char是有符號的或無符號的,它是實現定義的。

如果它是有符號的,那么由於常見的二進制補碼,值0xc5實際上將是負數(它將是十進制值-59 )。

當一個小的 integer 類型(如char )用作變量參數 function 的參數時,如sprintf ,那么它將被提升為int 如果類型是有符號的並且值為負,它將被符號擴展 因此,假設是普通的 32 位int ,帶符號的負值0xc5將被提升並符號擴展為0xffffffc5

要解決這個問題,最簡單的解決方案是簡單地使用顯式無符號類型,如uint8_t (它基本上是unsigned char的別名)。

除此之外,我還建議您使用hh格式類型前綴來明確說明參數是一個字節。

放在一起改成

uint8_t str[] = { 0x58, 0x01, 0x02, 0x20, 0x22, 0x00, 0xC5};

sprintf(hex + i*2, "%02hhX", str[i]);

至於str[i] & 0xff的區別,那是因為你屏蔽了int值的前 24 位。 所以0xffffffc5 & 0xff變成0x000000c5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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