C ++ char *到HEX转换

时间:2015-06-04 09:49:09

标签: c++ hex type-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;
}

那个shift(4)和掩码0xF是什么?它是如何工作的?此外,当我试图通过&#34; 1&#34;作为func的参数,它返回3100,但我认为它将返回0100,因为在dec或hex中1都是1。我错了吗?

2 个答案:

答案 0 :(得分:1)

十六进制表示中的一位数对应于二进制表示中的四位。

ch & 0xF0掩盖了高四位。 >> 4将它们转换为低位。

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

ch & 0xF屏蔽掉低四位。

0xAB & 0xF -> 0xB

您出现意外结果的原因是ASCII编码中的字符'1'0x31(十进制为49)。
你正在查找角色的数字表示,而不是它所代表的数字。

如果你这样做,你会得到预期的结果

char data[] = {1};

答案 1 :(得分:1)

旁注:

[NSURLProtocol registerClass:[MyProtocol class]]

这是对的。该函数采用Also, when i'am tried to pass "1" as argument to func, it returns 3100 数组,但作为原始数据在数组上运行,而不是像一组字符一样。这只是因为C没有&#34;字节&#34;类型,并且因为char类型保证为8位,它是可以用来表示字节的最方便的类型。

如果你查看ASCII表,&#39; 1&#39;对应于0x31。如果您使用以下内容,那么您将看到您期望的输出:

char

正如其他人所说,然后你得到0x00,因为你现有的代码也包括char[] data = {1}; 终结符。