将两个 ASCII 十六进制字符(两个 ASCII 字节)转换为一个字节
我想将两个 ASCII 字节转换为一个十六进制字节。 例如。
0x30 0x43 => 0x0C , 0x34 0x46 => 0x4F
...
ASCII 字节是 0
和 9
之间的数字或 A
和 F< 之间的字母/code> (仅限大写),因此在
0x30
... 0x39
和 0x41
... 0x46
之间
我知道如何“构建” 0x4F
与数字 0x34
和 0x46 : 0x4F = 0x34 * 0x10 + 0x46
所以,事实上,我想将一个 ASCII 字节转换为十六进制价值。
为此,我可以构建和数组将十六进制值分配给 ASCII 字符:
0x30 => 0x00
0x31 => 0x01
...
0x46 => 0x0F
但是,也许它有一个最“正确”的解决方案。
该程序将在 AVR µC 上运行并使用 avr-gcc
进行编译,因此 scanf()
/ printf()
解决方案不是合适的。
你有主意吗? 谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我无法理解你的例子,但是如果你想将包含十六进制ascii字符的字符串转换为其字节值(例如,字符串“56”变成字节0x56,你可以使用这个(假设你的系统正在使用ASCII)
您可以像例如这样使用它,
并且 res (必须至少是
in
参数长度的一半)现在包含 2 个字节 0x12,0x34另请注意,此代码需要十六进制字母 AF 必须大写,af 不行(而且它不做任何错误检查 - 所以你必须向它传递有效的东西)。
i can't make sense of your examples, but if you want to convert a string containing hexadecimal ascii characters to its byte value (e.g. so the string "56" becomes the byte 0x56, you can use this (which assumes your system is using ASCII)
You'd use it like e.g.
And res (which must be at least half the length of the
in
parameter) now contains the 2 bytes 0x12,0x34Note also that this code needs the hexadecimal letters A-F to be capital, a-f won't do (and it doesn't do any error checking - so you'll have to pass it valid stuff).
您可以使用
strtol()
,即avr-libc,或者你可以很容易地只写你的具体情况:You can use
strtol()
, which is part of avr-libc, or you can write just your specific case pretty easily:任务:
将包含十六进制 ascii 字符的字符串转换为其字节值
所以 ascii
"FF"
变成0xFF
而 ascii"10" (x31x30x00)
变成0x10
// 最终结果应该是:
//1。第一步:转换 asciiString,使其仅包含大写字母:
use:
//2。将包含十六进制 ascii 字符的字符串转换为其字节值:
//3.打印结果:
// 使用:
//4.结果应该是:
0xAA 0xAA 0x12 0xFF
//5.这是测试程序:
The task:
Convert a string containing hexadecimal ascii characters to its byte values
so ascii
"FF"
becomes0xFF
and ascii"10" (x31x30x00)
becomes0x10
// the final result should be:
//1. Firt step: convert asciiString so it contains upper cases only:
use:
//2. Convert a string containing hexadecimal ascii characters to its byte values:
//3. print result:
// use:
//4. The result should be:
0xAA 0xAA 0x12 0xFF
//5. This is the test program:
它可以工作,但可以进一步优化!
It's works, but could be much optimized !
这是一个适用于大写和小写十六进制字符串的版本:
Here's a version that works with both upper and lower-case hex strings:
将 2 个十六进制字符转换为一个字节需要两个步骤:
将
char
a
和b
转换为它们的数字(例如'F'
->0xF
),这是在两个大的 if else 分支中完成的,检查字符是否在'0'
范围内<代码>“9”,'A'
到'F'
或'a'
到'f'
。在第二步中,通过移位
a
将两个数字连接起来(最大值为0xF
(0b0000_FFFF
))4< /code> 向左 (
a << 4
->0b1111_0000
),然后应用按位或运算a
和b
((a << 4) | b
):Converting 2 hex chars to a byte is done in two steps:
Convert
char
a
andb
to their number (e.g.'F'
->0xF
), which is done in two big if else branches, that check if the char is in the range'0'
to'9'
,'A'
to'F'
or'a'
to'f'
.In the 2nd step the two numbers are joined by shifting
a
(largest value is0xF
(0b0000_FFFF
))4
to the left (a << 4
->0b1111_0000
) and then apply the bitwise or operation ona
andb
((a << 4) | b
):