2017-09-08 243 views
0

如何将字符串十进制转换为十六进制小数并将它们添加到字符指针?为什么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; 
} 
+0

'memcpy(value + 2,&value_value,value_length); '没有做你认为它做的事。 –

+0

'memcpy(value + 2,#num_value_length);' – zerkms

+1

也没有复制字符串终止符来使用'strlen' –

回答

0

您正在使用错误的变量:

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

而且,你不能特质你的价值作为字符串,只要是使用二进制值。从&value_value

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

是它的作品,但是我会使用'memcpy(value + 2,&value_value,value_length);'。那么我怎样才能把'num'复制到'value_value'? – Sam

+0

@Sam你不能:'value_value'是一个字符串,'num'是一个数字。 – zerkms

+0

@Sam,value_value = malloc(value_length); memcpy(value_value,&num,value_length); – bukkojot

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

这个表达式副本value_length字节:更改您的代码。

鉴于作为

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。为了清楚起见,你可以把它放到一个单独的变量中

相关问题