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 时,它 returns 3100,但我认为它会 return 0100,因为 1 在十进制或十六进制中都是 1。我错了吗?
十六进制表示中的一位对应二进制表示中的四位。
ch & 0xF0
屏蔽掉高四位。 >> 4
将它们移到低位。
0xAB & 0xF0 -> 0xA0
0xA0 >> 4 -> 0xA
ch & 0xF
屏蔽掉低四位。
0xAB & 0xF -> 0xB
出现意外结果的原因是字符 '1'
在 ASCII 编码中是 0x31
(十进制为 49)。
您正在查找字符的数字表示,而不是它所代表的数字。
如果你这样做,你会得到预期的结果
char data[] = {1};
旁注:
Also, when i'am tried to pass "1" as argument to func, it returns 3100
这是正确的。该函数接受一个 char
数组,但将该数组作为原始数据进行操作,而不是将其视为一组字符。这只是因为 C 没有 "byte" 类型,而且因为 char
类型保证是 8 位,所以它是可以用来表示字节的最方便的类型。
如果您查看 ASCII table,“1”对应于 0x31。如果您使用以下内容,那么您将看到您期望的输出:
char[] data = {1};
正如其他人所说,您随后会得到 0x00,因为您现有的代码还包括 NULL
终止符。
我想将字节数据(文件体)转换为十六进制以便打印。复制了一个转换函数,但不是很懂
#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 时,它 returns 3100,但我认为它会 return 0100,因为 1 在十进制或十六进制中都是 1。我错了吗?
十六进制表示中的一位对应二进制表示中的四位。
ch & 0xF0
屏蔽掉高四位。 >> 4
将它们移到低位。
0xAB & 0xF0 -> 0xA0
0xA0 >> 4 -> 0xA
ch & 0xF
屏蔽掉低四位。
0xAB & 0xF -> 0xB
出现意外结果的原因是字符 '1'
在 ASCII 编码中是 0x31
(十进制为 49)。
您正在查找字符的数字表示,而不是它所代表的数字。
如果你这样做,你会得到预期的结果
char data[] = {1};
旁注:
Also, when i'am tried to pass "1" as argument to func, it returns 3100
这是正确的。该函数接受一个 char
数组,但将该数组作为原始数据进行操作,而不是将其视为一组字符。这只是因为 C 没有 "byte" 类型,而且因为 char
类型保证是 8 位,所以它是可以用来表示字节的最方便的类型。
如果您查看 ASCII table,“1”对应于 0x31。如果您使用以下内容,那么您将看到您期望的输出:
char[] data = {1};
正如其他人所说,您随后会得到 0x00,因为您现有的代码还包括 NULL
终止符。