我想将两个 ASCII 字节转换为一个十六进制字节。 例如。
0x30 0x43 => 0x0C , 0x34 0x46 => 0x4F
...
ASCII 字节是 0
和 9
之间的数字或 A
和 F
之间的字母(上仅大小写),所以在 0x30
... 0x39
和 0x41
... 0x46
我知道如何用数字 0x34
和 0x46 “构建”
0x4F
:0x4F = 0x34 * 0x10 + 0x46
所以,实际上,我会将一个 ASCII 字节转换为十六进制值。
为此,我可以构建数组以将十六进制值分配给 ASCII 字符:
0x30 => 0x00
0x31 => 0x01
...
0x46 => 0x0F
但是,也许它有一个最“合适”的解决方案。
该程序将在 AVR µC 上运行并使用 avr-gcc
编译,因此 scanf()
/printf()
解决方案不合适。
你有想法吗? 谢谢
最佳答案
我无法理解你的示例,但是如果你想将包含十六进制 ascii 字符的字符串转换为其字节值(例如,字符串“56”变为字节 0x56,你可以使用这个(假设你的系统正在使用 ASCII)
uint8_t*
hex_decode(const char *in, size_t len,uint8_t *out)
{
unsigned int i, t, hn, ln;
for (t = 0,i = 0; i < len; i+=2,++t) {
hn = in[i] > '9' ? in[i] - 'A' + 10 : in[i] - '0';
ln = in[i+1] > '9' ? in[i+1] - 'A' + 10 : in[i+1] - '0';
out[t] = (hn << 4 ) | ln;
}
return out;
}
您可以像这样使用它
char x[]="1234";
uint8_t res[2];
hex_decode(x,strlen(x),res);
并且 res(必须至少是 in
参数长度的一半)现在包含 2 个字节 0x12,0x34
另请注意,此代码需要十六进制字母 A-F 为大写,而 a-f 不会(并且它不执行任何错误检查 - 因此您必须向其传递有效内容)。
关于在一个字节中转换两个 ASCII 十六进制字符(两个 ASCII 字节),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6933039/