2017-09-08 308 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。爲了清楚起見,你可以把它放到一個單獨的變量中

相關問題