将字符串小数转换为十进制十进制



如何将字符串小数转换为十六进二点并将其添加到炭指针中?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("%02xn", value[i]);
    return 0;
}
memcpy(value + 2, &value_value, value_length);

此表达式复制了value_length的CC_4字节。

鉴于它被称为

char *value_value

&value_value被读为pointer-to-a-pointer-to-a-char。因此,实际上您正在阅读指针值。

如何解决:

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

您的代码另一个问题:

您使用的是strlen(value),而value不是终止的C弦。这只是您填充数据的一系列字节。

如何修复:

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

您正在使用错误的变量:

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

另外,就使用二进制值而言,您不得将其值作为字符串。将您的代码更改为:

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

最新更新