将字符串十进制转换为十六进制十进制

标签 c

如何将字符串十进制转换为十六进制十进制并将它们添加到 char 指针?为什么 memcpy(value + 2, &value_value, value_length); 不起作用,结果是 0x02 0x01 而不是 0x02 0x01 0x4f

#include <string.h> /* strlen */
#include <stdio.h> /* printf */
#include <stdint.h> /* int32_t */
#include <stdlib.h> /* strtol */

int main()
{
    char value_type = 0x02;
    char *value_value = "79"; /* Must convert to 4f */

    char value_length;
    int32_t num = strtol(value_value, NULL, 10);
    if (num < 255)
        value_length = 0x01;
    else if (num < 65536)
        value_length = 0x02;
    else if (num < 16777216)
        value_length = 0x03;
    else if (num < 4294967295)
        value_length = 0x04;

    char *value = malloc(2 + value_length);

    memcpy(value, &value_type, 1);
    memcpy(value + 1, &value_length, 1);
    memcpy(value + 2, &value_value, value_length);

    /* expectation: 0x02 0x01 0x4f */
    for (int i = 0; i < strlen(value); i++)
        printf("%02x\n", value[i]);
    return 0;
}

最佳答案

memcpy(value + 2, &value_value, value_length);

此表达式从 &value_value 复制 value_length 个字节。

鉴于它被声明为

char *value_value

&value_value 被读取为指向字符的指针。因此,您正在有效地读取指针值。

如何解决:

memcpy(value + 2, &num, value_length);

您的代码的另一个问题:

您正在使用 strlen(value),而 value 不是以 null 结尾的 C 字符串。它只是一个用数据填充的字节数组。

如何修复:

在这种情况下不要使用strlen,您知道数组的大小:2 + value_length。为了清楚起见,您可以将其放入单独的变量中。

关于将字符串十进制转换为十六进制十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46107991/

相关文章:

c - 在 C 中使用递归反转链表

c - 多处理器系统上的线程

c++ - 以特定值评估多项式的​​最快方法

c - 按位与符号字符

C-海湾合作委员会: no compiler warning with different function-declaration/implementation

c - df 和 statfs 的输出不同

c - 虚拟 Listview 控件的(主)缓冲区中应该有多少行?

更改函数内的矩阵并在 main 中使用它

c - 循环时求平均值,总和不会清除,因此会不断添加上一个循环条目中的数字

c++ - 可移植图书馆的语言选择