簡體   English   中英

字符轉十六進制不顯示字符串的 ASCII 值

[英]Char to Hex not showing string's ASCII value

玩弄 C 或 C99,我試圖了解轉換、位移和十六進制值的工作原理。

我有以下問題

char c[4];
c[0] = 0x41;
c[1] = 0x42;
c[2] = 0x43;
c[3] = 0x00;
printf("%s", c); //prints ABC
printf("%X", c); //prints 99B11760

99B11760從哪里來?

所以同樣...

int main() {
    char a = 'a'; //ascii value is 0x41 (Mistake I made, 'a' is 0x61, 'A' is 0x41) 
    printf("%X\n",a); //outputs "61"? (THIS IS CORRECT OUTPUT, 'a' != 0x41)
}

我一直在尋找如何解決將十六進制值存儲到 char 中的類似問題的解決方案,但我無法理解的是為什么或某些存儲值不對應於它的 ASCII 值的位置。 由於它既不是 ASCII 十六進制值、十進制值或八進制值,使用 printf("%X\n", c) 時打印的是什么值;

允許 C 中的數組變量自動轉換為地址值(也稱為指針值)。 您看到的 output 與數組的內容完全無關。

也許你打算這樣做?

char c[4];
c[0] = 0x41;
c[1] = 0x42;
c[2] = 0x43;
c[3] = 0x00;
printf("%X", *(unsigned int*)c );

99B11760從哪里來?

它是c在你強制它衰減為一個指針之后碰巧擁有的值。

我一直在尋找解決這個問題的方法

什么問題? 是否有您正在嘗試做但您不知道該怎么做的事情? “我做了一些毫無意義的事情,得到了一個毫無意義的答案”不是問題。 只是不要那樣做。

.. 但我遇到的問題是理解為什么或在哪里打印 61 而不是 ASCII 十六進制值 0x41。 它不是十進制值,也不是八進制值。

如您所見,它沒有應有的特定值。 但它必須是某種東西。 如果你把一個骰子拋向空中,結果是 2,你想知道為什么它是 2 嗎? 當然不是。 只有當它應該是一回事但又另一回事時,你才會有問題。 在這種情況下,沒有什么應該的。

 printf("%X", c); //prints 99B11760

這會調用未定義的行為。 x轉換說明符需要一個unsigned int但您傳遞的是char *

在問題的第二部分,您應該將a轉換為unsigned int

printf("%X\n", (unsigned int) a);

ascii A0x41 ,但 ascii 值a 0x61

對於第一個問題,當您使用%X格式打印c時,它打印的是數組的地址(第一個字符的地址)。 對於第二個問題,這是因為a的 ASCII 值為 97(十進制),轉換為十六進制為 61。如果使用A字符,則將打印 41,因為大寫字母A的 ASCII 值為 65。

c是一個指針,因此當您使用%s以外的任何內容打印它時,您將打印出指針地址。

int main() {
char a = 'a'; //ascii value is 0x41
printf("%X\n",a); //outputs "61"?
}

在這種情況下,首先要將 'a'(ascii 值 = 97) 存儲到字符 a 中,因此字符 a 包含 97,然后以十六進制形式將 97 打印為“0x61”

char c[4];
c[0] = 0x41;
c[1] = 0x42;
c[2] = 0x43;
c[3] = 0x00;
printf("%s", c); //prints ABC
printf("%X", c); //prints 99B11760

在這種情況下

         '0x41' in decimal value is 65 is 'A' in ASCII
         '0x42' in decimal value is 66 is 'B' in ASCII
         '0x43' in decimal value is 67 is 'C' in ASCII   
         '0x00' in decimal value is 00 is null in ASCII   

如果格式說明符是字符/字符串類型,它將是 output 'ABC '

暫無
暫無

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

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