c - 如何将字符串转换为 int32 到十六进制并存储到缓冲区

标签 c

我正在尝试将字符串转换为字符串,然后再转换为十六进制。字符串值表示例如 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/

相关文章:

c - 通过从 char * 转换为 int 进行整数验证

c - 使用星号分隔数字数字的程序

c - Scanf 在 C 中跳过每隔一个 while 循环

c - 如何限制 C 中的套接字速度?

c - 使用 atoi() 对整数进行输入验证

c - 无法预测以下程序的输出

c - 捕获的 IP 数据包的源地址和目标地址相同

c - 实现插入排序时答案的差异

c - 为什么这些构造使用增量前和增量后未定义的行为?

C函数输入字符串并计算