簡體   English   中英

C ++ char *到HEX的轉換

[英]C++ char* to HEX conversion

我想將字節數據(文件主體)轉換為十六進制以便打印。 我已經復制了一個函數進行轉換,但並不能完全理解它。

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <string>

std::string byte_2_str(char* bytes, int size) {
    char const hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',   'B','C','D','E','F'};
    std::string str;
    for (int i = 0; i < size; ++i) {
        const char ch = bytes[i];
        str.append(&hex[(ch  & 0xF0) >> 4], 1);
        str.append(&hex[ch & 0xF], 1);
    }

return str;

}

int _tmain(int argc, _TCHAR* argv[])
{

    char data[] = "1";
    std::string str = byte_2_str(data, sizeof(data));
    std::cout << str << std::endl;


    system("PAUSE");
    return 0;
}

該移位(4)和掩碼0xF的作用是什么? 以及它如何運作? 另外,當我嘗試將“ 1”作為參數傳遞給func時,它將返回3100,但是我認為它將返回0100,因為1在dec或hex中均為1。 我錯了嗎?

十六進制表示中的一位對應於二進制表示中的四位。

ch & 0xF0屏蔽高四位。 >> 4將它們移至低位。

0xAB & 0xF0 -> 0xA0
0xA0 >> 4 -> 0xA

ch & 0xF掩蓋了低四位。

0xAB & 0xF -> 0xB

出現意外結果的原因是ASCII編碼中的字符'1'0x31 (十進制為49)。
您正在查找字符的數字表示形式,而不是它表示的數字。

如果您這樣做,將會得到預期的結果

char data[] = {1};

邊注:

Also, when i'am tried to pass "1" as argument to func, it returns 3100

這是對的。 該函數采用一個char數組,但作為原始數據在該數組上進行操作,而不是好像它是一組字符一樣。 這僅僅是因為C沒有“字節”類型,並且因為char類型被保證為8位,所以它是可用於表示字節的最方便的類型。

如果您在ASCII表中查找,則“ 1”對應於0x31。 如果使用以下內容,那么您將看到期望的輸出:

char[] data = {1};

正如其他人所說,由於現有代碼還包含NULL終止符,因此您將獲得0x00。

暫無
暫無

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

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