我在char指针中有一个十六进制值(例如'F3'),我想将它转换为byte,因为我希望它放入一个数组。我知道有很多解决方案,但它们不是我想要的。
提前致谢!
编辑:
好吧,也许我没有写过一切。 我现在拥有的:
char aChar[5];
itoa (j, aChar, 16);
j现在是3,我只想要它在字节中。 Atoi,scanf没有帮助,这些是不同的解决方案。
答案 0 :(得分:6)
由于你已经标记了这个C ++而不是C,我不打算使用任何C函数(assert()
除外)来演示行为,边缘条件,等等)。这是一个示例文件。我们称之为hex2byte.cpp:
#include <sstream>
#include <cassert>
unsigned char hex2byte(const char* hex)
{
unsigned short byte = 0;
std::istringstream iss(hex);
iss >> std::hex >> byte;
return byte % 0x100;
}
int main()
{
const char* hex = "F3";
assert(hex2byte(hex) == 243);
assert(hex2byte("") == 0);
assert(hex2byte("00") == 0);
assert(hex2byte("A") == 10);
assert(hex2byte("0A") == 10);
assert(hex2byte("FF") == 255);
assert(hex2byte("EEFF") == 255);
assert(hex2byte("GG") == 00);
assert(hex2byte("a") == 10);
assert(hex2byte("0a") == 10);
assert(hex2byte("f3") == 243);
assert(hex2byte("ff") == 255);
assert(hex2byte("eeff") == 255);
assert(hex2byte("gg") == 00);
}
成功:
% make hex2byte
g++ -Wall -Wextra -Wshadow -pedantic -Weffc++ -Werror hex2byte.cpp -o hex2byte
运行它:
% ./hex2byte
没有断言。添加错误处理(例如检查何时hex == NULL
,等等)。
答案 1 :(得分:3)
一个字节通常只是一个无符号字符
myArray[n] = (unsigned char)*p;
或者你的意思是你有一个十六进制值的字符串表示?
答案 2 :(得分:1)
给定char *
"F3"
:
char *hexstr = "F3";
然后你可以这样做:
unsigned char byteval =
(((hexstr[0] >= 'A' && hexstr[0] <= 'Z') ? (10 + hexstr[0] - 'A') :
(hexstr[0] >= 'a' && hexstr[0] <= 'z') ? (10 + hexstr[0] - 'a') :
(hexstr[0] >= '0' && hexstr[0] <= '9') ? (hexstr[0] - '0') : 0) << 4) |
((hexstr[1] >= 'A' && hexstr[1] <= 'Z') ? (10 + hexstr[1] - 'A') :
(hexstr[1] >= 'a' && hexstr[1] <= 'z') ? (10 + hexstr[1] - 'a') :
(hexstr[1] >= '0' && hexstr[1] <= '9') ? (hexstr[1] - '0') : 0);
我很遗憾它的丑陋;我相信它可以改进。
您可以将其转换为函数:
inline unsigned char hextobyte(const char *s) {
return
(((s[0] >= 'A' && s[0] <= 'Z') ? (10 + s[0] - 'A') :
(s[0] >= 'a' && s[0] <= 'z') ? (10 + s[0] - 'a') :
(s[0] >= '0' && s[0] <= '9') ? (s[0] - '0') : 0) << 4) |
((s[1] >= 'A' && s[1] <= 'Z') ? (10 + s[1] - 'A') :
(s[1] >= 'a' && s[1] <= 'z') ? (10 + s[1] - 'a') :
(s[1] >= '0' && s[1] <= '9') ? (s[1] - '0') : 0);
}
答案 3 :(得分:1)
我至少可以想到五种方式:
sscanf
与%x
strtol
使用正确的基础istringstream
(尽管你必须从无符号短文转换为无符号字符)您列出的方式都不起作用。但你的问题仍然不是很清楚,你有一个字符,不知何故你使用itoa
转换为十六进制,现在你想转换为一个字节!?!演员出了什么问题?例如unsigned char byte = static_cast<unsigned char>(charvalue);