【问题标题】:Convert string decimal to hex decimal将字符串十进制转换为十六进制十进制
【发布时间】:2017-09-08 03:00:40
【问题描述】:

如何将字符串十进制转换为十六进制十进制并将它们添加到 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, &amp;value_value, value_length); 并没有按照你的想法去做。
  • memcpy(value + 2, &amp;num, value_length);
  • 也没有复制字符串终止符使用strlen

标签: c


【解决方案1】:
memcpy(value + 2, &value_value, value_length);

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

鉴于它被声明为

char *value_value

&amp;value_value 被读取为pointer-to-a-pointer-to-a-char。如此有效地读取指针值。

如何解决:

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

您的代码的另一个问题:

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

如何解决:

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

【讨论】:

    【解决方案2】:

    你使用了错误的变量:

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

    此外,你不能将你的值作为字符串,只要它使用二进制值。将您的代码更改为:

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

    【讨论】:

    • 是的,它的作品,但我会使用memcpy(value + 2, &amp;value_value, value_length);。那么如何将num 复制到value_value
    • @Sam 你不能:value_value 是一个字符串,num 是一个数字。
    • @Sam, value_value=malloc(value_length);memcpy(value_value, &num, value_length);