2015-11-24 19 views
0

現在我有一個u8數組,我成功地將其轉換爲十六進制字符數組。現在,試圖將其改回到u8陣列已經很不起眼了。我想這樣的代碼:將十六進制字符數組轉換爲C中的u8數組

 // DEMO: 
     char *message = "0f236a1f"; 
     int i; 
     u8 final[4]; 
     memset(final, 0, 4); 
     char* part = "00"; 
     for (i = 0; i < 4; i++) 
     { 
      memcpy(part, &message[i*2], 2); 
      u8 num = 0; 
      sscanf(part, "%x", &num); 
      printf("%i", num); 
      final[i] = num; 
     } 

我用預填充值,以防止搞亂零我有我的實際數據的大部分停留內存值的一切。儘管我已經嘗試了一切,但偶爾也會分配錯誤的值,並且我無法在網上找到任何其他方法來執行相同的操作。如果你能幫助我,我恨C.

編輯:

我修改我的代碼,和我展示真實的東西,現在,看它是否有幫助。可變消息在巨型char *陣列中是464個零。該控制檯還偶爾印數除了零,不知道爲什麼:

 int i; 
     u8 final[232]; 
     memset(final, 0, 232); 
     char part[3] = "00"; 
     part[2] = 0; 
     for (i = 0; i < 232; i++) 
     { 
      memcpy(part, &message[i*2], 2); 
      unsigned int num = 0; 
      sscanf(part, "%x", &num); 
      printf("%i", num); 
      final[i] = (u8)num; 
     } 
+2

看來你正試圖用這行'memcpy(part,&message [i * 2],2)'修改一個字符串文字,因爲零件是用字符串文字'char * part ='初始化的00" ;'。這在C中是非法的。 –

+0

它應該只是char *部分[2];代替? – oMiKeY

+2

@BobbySacamano不修改字符串文字看到這裏:http://stackoverflow.com/questions/718477/string-literals但它仍然是未定義的行爲。 –

回答

3

你正在創建這些線路未定義行爲:

char* part = "00"; 
    for (i = 0; i < 4; i++) 
    { 
     memcpy(part, &message[i*2], 2); 
     ... 
     sscanf(part, "%x", &num); 

part點,只讀存儲器(這就是爲什麼像琴絃這個我們通常聲明爲const char*引起編譯器錯誤修改時發生的企圖)More info here.

你應該爲你的字符串和空結束與分配足夠的空間:

char part[3] = "00"; 
+0

爲什麼'part'不是字符串文字?實際上'part'是一個字符串,這就是未定義行爲的原因。不要與缺少的'const'混淆「00」是一個字符串文字,「part」只是一個非const的指針。 –

+0

@iharob'part'用字符串文字(即「00」')初始化,但它不是字符串文字。至少我從這裏認爲是這樣:http://en.cppreference.com/w/cpp/language/string_literal。也感謝您糾正我的錯字。 –

+0

請勿使用[tag:C++]資源來學習[tag:c]。儘管語法相似,但他們是不同的語言。在那個環節我可以證實這一點。這讓我現在更討厭C++了。 –

相關問題