我正在尝试将字符串转换为字符串,然后再转换为十六进制。字符串值表示例如 266 之类的整数。我这样做的主要原因是,我将所有值存储在字符串中并希望通过网络将它们发送到主机,因此我必须将所有值表示为十六进制。如果我将字符串“266
”转换为 int32,然后转换为十六进制“0x010a
”并将十六进制值存储在缓冲区中,则缓冲区包含“30 31
”而不是 0x010a。这是我的问题的运行示例。
#include <stdio.h> /* printf */
#include <stdint.h> /* int32_t*/
#include <stdlib.h> /* strtol, malloc */
#include <string.h> /* memcpy */
int integer_to_hex(
char **out_hex,
int *out_len,
int32_t value)
{
*out_len = 0;
*out_hex = NULL;
if ( value < 128 && value > -128)
{
*out_len = 1;
*out_hex = malloc(*out_len);
sprintf(*out_hex,"%02x", value & 0xff);
return 0;
}
else if (value < 32767 && value > -32767)
{
*out_len = 2;
*out_hex = malloc(*out_len);
sprintf(*out_hex,"%04x", value);
return 0;
}
return -1;
}
int main()
{
char *value_str = "266";
int32_t val_int = strtol(value_str,NULL,10);
char *out_hex;
int out_len;
int ret_val = integer_to_hex(&out_hex, &out_len, val_int);
printf("ret_val=%d\n", ret_val);
printf("out=%s\n", out_hex);
printf("out_len=%d\n", out_len);
char *buffer = malloc(out_len);
memcpy(&buffer, &out_hex, out_len);
int i;
for(i=0;i<out_len;i++)
printf("buffer=%02x\n", buffer[i]);
return 0;
}
输出:
ret_val=0
out=010a
out_len=2
buffer=30
buffer=31
最佳答案
您的问题似乎是对数字可以“十六进制”存储的根本误解。计算机总是以二进制形式存储数字。
以十六进制显示数字很方便,因为一组四个二进制数字(位)与一个十六进制数字(0
-f
)完全匹配。
但是如果你想让计算机在屏幕上显示十六进制数字,唯一的办法就是将这些数字编码为字符。在典型的基于 ASCII 的实现中,每个字符占用八(!)位。
当您读取数字 266 时,存储在 uint32_t
低 16 位中的是
0000 0001 0000 1010
0 1 0 a (mapping to hex)
如果你想显示这个,你需要字符 0
, 1
and a
,它们以 ASCII 编码为 30 (0011 0000)
、31 (0011 0001)
和 61 (0110 0001)
。具有 %x
格式说明符的 printf()
函数族执行此转换。这给了你
3 0 | 3 1 | 3 0 | 6 1 (mapping to hex)
0011 0000 | 0011 0001 | 0011 0000 | 0110 0001 (four `char`)
问题中的代码现在采用此字符串的各个字节(解释为数字!)并再次转换为十六进制字符串!
关于c - 如何将字符串转换为 int32 到十六进制并存储到缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47135175/