在一个字节中转换两个 ASCII 十六进制字符(两个 ASCII 字节)

标签 c ascii hex avr-gcc

我想将两个 ASCII 字节转换为一个十六进制字节。 例如。

0x30 0x43 => 0x0C , 0x34 0x46 => 0x4F ...

ASCII 字节是 09 之间的数字或 AF 之间的字母(上仅大小写),所以在 0x30 ... 0x390x41 ... 0x46

之间

我知道如何用数字 0x340x46 “构建”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/

相关文章:

c - C 结构体中的函数指针

c - 关于数组和指针

php - 将特殊字符(即元音变音)转换为最可能的 ascii 表示形式

python - 提取十六进制编码字符串的一部分

c - 为什么我的数组的前一个元素会发生变化(C 中的字符串数组)

c - 如何在游戏引擎中使用全局 lua_State *?

javascript - 对于字符串中的每个字母,打印其 ascii 字符表示

C# ASCII GetBytes如何设置使用哪个字符进行无法识别的转换?

hex - 带有十六进制数字的 Tcl 表达式?

c++ - 在 C++ 中将十六进制转换为字节