繁体   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