C 中的十六进制到字符数组
给定一串十六进制值 ie 例如“0011223344”,即 0x00、0x11 等。
如何将这些值添加到 char 数组中?
相当于说:
char array[4] = { 0x00, 0x11 ... };
Given a string of hex values i.e. e.g. "0011223344" so that's 0x00, 0x11 etc.
How do I add these values to a char array?
Equivalent to say:
char array[4] = { 0x00, 0x11 ... };
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
您无法将 5 个字节的数据放入 4 个字节的数组中;这会导致缓冲区溢出。
如果字符串中有十六进制数字,则可以使用 sscanf() 和循环:
请注意,打印以零字节开头的字符串需要小心;大多数操作在第一个空字节处终止。请注意,此代码并未以空值终止缓冲区;目前尚不清楚是否需要空终止,并且我声明的缓冲区中没有足够的空间来添加终端空(但这很容易修复)。如果代码被打包为子例程,则很有可能需要返回转换后的字符串的长度(尽管您也可以认为它是源字符串的长度除以二)。
You can't fit 5 bytes worth of data into a 4 byte array; that leads to buffer overflows.
If you have the hex digits in a string, you can use
sscanf()
and a loop:Note that printing the string starting with a zero-byte requires care; most operations terminate on the first null byte. Note that this code did not null-terminate the buffer; it is not clear whether null-termination is desirable, and there isn't enough space in the buffer I declared to add a terminal null (but that is readily fixed). There's a decent chance that if the code was packaged as a subroutine, it would need to return the length of the converted string (though you could also argue it is the length of the source string divided by two).
我会做这样的事情;
I would do something like this;
如果字符串是正确的并且不需要保留其内容,那么我会这样做:
编辑 1:抱歉,我忘记用字母 AF (af) 进行计算
编辑 2:我尝试编写更迂腐的代码:
测试:
结果:
If the string is correct and no need to keep its content then i would do it this way:
EDIT 1: sorry, i forget to calculate with the letters A-F (a-f)
EDIT 2: i tried to write a more pedantic code:
Testing:
Result:
我一直在寻找同样的东西,经过大量阅读后,终于创建了这个函数。认为这可能有帮助,有人
I was searching for the same thing and after reading a lot, finally created this function. Thought it might help, someone
假设这是一个小端 ascii 平台。
也许OP的意思是“字符数组”而不是“字符串”。
我们使用成对的字符和位掩码..注意x16的转变..
并且定义了函数encode()...
这种方法在其他地方漂浮,它不是我的原创作品,但它是旧的。
纯粹主义者不喜欢它,因为它不可移植,但扩展也很简单。
Let's say this is a little-endian ascii platform.
Maybe the OP meant "array of char" rather than "string"..
We work with pairs of char and bit masking.. note shiftyness of x16..
and function encode() is defined...
This approach floats around elsewhere, it is not my original work, but it is old.
Not liked by the purists because it is non-portable, but extension would be trivial.
我知道的最好方法:
该函数返回 dest_buffer 中保存的转换字节数。
输入字符串可以包含空格和大小写混合的字母。
“01 02 03 04 ab Cd eF 垃圾 AB”
转换为 dest_buffer 包含
01 02 03 04 ab cd ef
以及
“01020304abCdeFgarbageAB”
的翻译如前。
解析在第一个“错误”处停止(非十六进制,非空格)。
注意:这也是一个有效的字符串:
“01 2 03 04 ab Cd eF 垃圾 AB”
并产生:
01 02 03 04 ab cd ef
The best way I know:
The function returns the number of converted bytes saved in dest_buffer.
The input string can contain spaces and mixed case letters.
"01 02 03 04 ab Cd eF garbage AB"
translates to dest_buffer containing
01 02 03 04 ab cd ef
and also
"01020304abCdeFgarbageAB"
translates as before.
Parsing stops at the first "error" (non hex, non space).
Note: also this is a valid string:
"01 2 03 04 ab Cd eF garbage AB"
and produces:
01 02 03 04 ab cd ef
Fatalfloor...
有几种方法可以做到这一点...首先,您可以使用 memcpy() 将精确表示复制到 char 数组中。
您也可以使用位移位和位屏蔽技术。我猜这就是你需要做的,因为这听起来像是一个家庭作业问题。
最后,您可以使用一些奇特的指针间接来复制您需要的内存位置。
所有这些方法的详细信息如下:
将 int 存储在 char 数组中?
Fatalfloor...
There are a couple of ways to do this... first, you can use memcpy() to copy the exact representation into the char array.
You can use bit shifting and bit masking techniques as well. I'm guessing this is what you need to do as it sounds like a homework problem.
Lastly, you can use some fancy pointer indirection to copy the memory location you need.
All of these methods are detailed here:
Store an int in a char array?
给出一个最好的方法:
十六进制字符串转数值,即str[] = "0011223344"转值为0x0011223344,使用
done。如果需要删除开头的 0x00,请参见下文。
但对于 LITTLE_ENDIAN 平台,加上:
十六进制值到 char 数组,值 0x11223344 到 char arr[N] = {0x00, 0x11, ...}
完成。
笔记:
为了在 32 位系统上将长字符串转换为 64 位十六进制 char arr,您应该使用 unsigned long long 而不是 unsigned long,并且 htonl 还不够,所以请按照下面的方式自行操作,因为可能没有 htonll、htonq 或 hton64等:
请参阅 http:// /effocore.googlecode.com/svn/trunk/devel/effo/codebase/builtin/include/impl/sys/bswap.h
Give a best way:
Hex string to numeric value , i.e. str[] = "0011223344" to value 0x0011223344, use
done. if need remove beginning 0x00, see below.
though for LITTLE_ENDIAN platforms, plus:
Hex value to char array, value 0x11223344 to char arr[N] = {0x00, 0x11, ...}
done.
Notes:
For converting long string to a 64 bits hex char arr on a 32-bit system, you should use unsigned long long instead of unsigned long, and htonl is not enough, so do it yourself as below because might there's no htonll, htonq or hton64 etc:
see http://effocore.googlecode.com/svn/trunk/devel/effo/codebase/builtin/include/impl/sys/bswap.h
下面是我的
hex2bin
和bin2hex
实现。这些函数:
-1
表示无效的十六进制字符串)hex2bin
bin2hex
Below are my
hex2bin
andbin2hex
implementations.These functions:
-1
means invalid hex string)hex2bin
bin2hex
首先,你的问题问得不太准确。该字符串是
std::string
还是char
缓冲区?编译时设置?动态内存几乎肯定是您的答案。
然后,您可以遍历输入并将其分配给数组。
First, your question isn't very precise. Is the string a
std::string
or achar
buffer? Set at compile-time?Dynamic memory is almost certainly your answer.
Then, you can walk through the input, and assign it to the array.