C++ 如何将字符串转换为十六进制表示?
我有一个存储为字符串的键,我正在尝试获取字符串的十六进制表示形式。我不想从ASCII转换成十六进制C++ 如何将字符串转换为十六进制表示?,c++,C++,我有一个存储为字符串的键,我正在尝试获取字符串的十六进制表示形式。我不想从ASCII转换成十六进制 std::string keyInStr = "1314191A1B"; unsigned char keyInHex[5]; for (int i = 0; i < 5; i++) { keyInHex[i] = keyInStr[i]; printf("%02X ", keyInHex[i]); } 当前输出对应于字符串中ascii字符的十六进制编码(0x31表
std::string keyInStr = "1314191A1B";
unsigned char keyInHex[5];
for (int i = 0; i < 5; i++)
{
keyInHex[i] = keyInStr[i];
printf("%02X ", keyInHex[i]);
}
当前输出对应于字符串中ascii字符的十六进制编码(
0x31
表示'1'
,0x33
表示'3'
,等等)。这是正常的,因为您的代码只是将输入复制为每个字符一个字符:
keyInHex[i] = keyInStr[i]; // output in hex is the same as input in ascii
如果要将输入转换为十六进制,将两个输入数字组合成一个输出数字(例如,'1'
和'3'
以生成与0x13
对应的一个字节),则需要对输入字符串进行两乘二的迭代,每次取与ascii表示的十六进制数字等效的二进制
通过将ascii十六进制数字转换为二进制数字来实现:
if (keyInStr[i]>='A')
digit = keyInStr[i]-'A'+0x0A; // assuming that uppercase only is used
else digit = keyInStr[i]-'0';
然后,您可以将两个这样的数字组合为:
keyInHex[j] = (digit1<<4) | digit2;
由于我不想做你的家庭作业,我让你作为练习重写循环,以按2处理数字。注意:在最坏的情况下,在最后一次迭代中可能有一个孤立的数字
keyInHex[i] = keyInStr[i]
如果您知道您的字符串包含一个包含偶数个字符的精确十六进制字符串,则这将起作用:
std::string keyInStr = "1314191A1B";
std::vector<char> keyInHex;
for (size_t i = 0; i < keyInStr.length(); i += 2)
{
std::string currentByte = keyInStr.substr(i, 2);
keyInHex.push_back(static_cast<char>(std::strtol(currentByte.c_str(), NULL, 16)));
}
for (size_t i = 0; i < keyInHex.size(); i++)
{
std::cout << std::hex << std::setw(2) << (keyInHex.at(i) & 0xFF) << " ";
}
std::string keyInStr=“1314191A1B”;
std::向量keyinEx;
对于(尺寸i=0;i
#include <iostream>
using namespace std;
int main()
{
std::string keyInStr = "1314191a1b";
const int SIZE = 5;
unsigned char keyInHex[SIZE];
unsigned long long hexVal = stoull(keyInStr, nullptr, 16);
for (int i = 0; i < SIZE; i++)
{
keyInHex[i] = (hexVal >> ((SIZE - i - 1) * 8)) & 0xFF;
printf("%02X ", keyInHex[i]);
}
return 0;
}
#包括
使用名称空间std;
int main()
{
std::string keyInStr=“1314191a1b”;
常数int SIZE=5;
无符号字符keyinEx[SIZE];
无符号长hexVal=stoull(keyInStr,nullptr,16);
对于(int i=0;i>((SIZE-i-1)*8))&0xFF;
printf(“%02X”,keyinEx[i]);
}
返回0;
}
您说您不想将ASCII转换为十六进制,但我想不出不涉及字符串到二进制数据转换的东西。从那里它只需移位位并进行掩码。显示的字符串已经是十六进制表示形式。您真正想要的是将十六进制解码回其原始二进制数据,然后将该数据打印为十六进制。这是多余的。只需按原样打印字符串
,在每2个字符后插入空格,例如:
std::string keyInStr = "1314191A1B";
for (int i = 0; i < keyInStr.size(); i += 2)
{
//printf("%.2s ", keyInStr.c_str()+i);
std::cout << keyInStr.substr(i, 2) << " ";
}
std::string keyInStr=“1314191A1B”;
对于(int i=0;i std::cout“我不想从ASCII转换为十六进制。”也许我的措辞不正确,但我的意思是我没有试图得到这个输出31 33 34 31。@Govind我刚刚意识到OP希望始终获取两个ASCII十六进制数字,并最终将它们转换为整数值。@RemyLebeau,我不仅仅是想打印数据。我需要使用它,我需要它符合我的预期。这有什么意义吗服务?这回答了我的问题,我真的很喜欢你的替代解决方案。考虑到我问了一个有效的问题,我不确定他们为什么给我-3。
#include <iostream>
using namespace std;
int main()
{
std::string keyInStr = "1314191a1b";
const int SIZE = 5;
unsigned char keyInHex[SIZE];
unsigned long long hexVal = stoull(keyInStr, nullptr, 16);
for (int i = 0; i < SIZE; i++)
{
keyInHex[i] = (hexVal >> ((SIZE - i - 1) * 8)) & 0xFF;
printf("%02X ", keyInHex[i]);
}
return 0;
}
std::string keyInStr = "1314191A1B";
for (int i = 0; i < keyInStr.size(); i += 2)
{
//printf("%.2s ", keyInStr.c_str()+i);
std::cout << keyInStr.substr(i, 2) << " ";
}
unsigned char hex2dec(const std::string &s, size_t pos)
{
char ch = s[pos];
if (ch >= 'A' && ch <= 'F')
return (ch - 'A') + 10;
if (ch >= 'a' && ch <= 'f')
return (ch - 'a') + 10;
if (ch >= '0' && ch <= '9')
return (ch - '0');
// error!
}
unsigned char decodeHexByte(const std::string &s, size_t pos)
{
return (hex2dec(s, pos) << 4) | hex2dec(s, pos+1);
}
std::string keyInStr = "1314191A1B";
unsigned char keyInHex[5] = {};
for (int i = 0, j = 0; i < 5; ++i, j += 2)
{
keyInHex[i] = decodeHexByte(keyInStr, j);
//printf("%02X ", keyInHex[i]);
std::cout << std::hex << std::setw(2) << std::setfill('0') << (int) keyInHex[i] << " ";
}
std::string keyInStr = "1314191A1B";
unsigned char keyInHex[5] = {};
for (int i = 0; i < 5; ++i)
{
keyInHex[i] = std::stoi(keyInStr.substr(i*2, 2), nullptr, 16);
//printf("%02X ", keyInHex[i]);
std::cout << std::hex << std::setw(2) << std::setfill('0') << (int) keyInHex[i] << " ";
}