2011-10-28 133 views
3

我想我的字節數組和字符數組的理解導致了我一些問題,這裏是我的問題:轉換字節數組/字符數組到十六進制字符串用C

我有拉從WebSphere MQ和消息應用程序將它們發送到目標系統。

MQ消息具有表示消息的MSGID的MQBYTE24(基本上是字節數組24)。我的目標是將其轉換爲十六進制字符串。

在隊列中的在我的Linux框消息1的WMQ探險有「AMQ QM01」的消息識別符(至少它是什麼樣子),並且字節是如以下顯示在瀏覽器:

00000 41 4D 51 20 51 4D 30 31--20 20 20 20 20 20 20 20 |AMQ QM01  | 
00010 BD F4 A8 4E A2 A3 06 20--       |...N...   | 

現在,當我的代碼運行時,我拿起相同的消息ID並嘗試將其轉換爲十六進制字符串。

確切的消息ID,而調試是:

AMQ QM01 \ 275 \ 364 \ 250N \ 242 \ 243 \ 006

並通過我的轉換(下面的代碼)運行後,我得到:

414D5120514D30312020202020202020FFFFFF4EFFFF6

正如你可以看到它是一個將WMQ資源管理器顯示,任何IDE略有不同我在這裏做錯了什麼?

我想這是我從MQBYTE24轉換爲char ....事情錯了那裏......

下面是產生「錯誤的結果」的小樣本程序.....我我必須使用字節數組而不是char?

以下的輸出:

結果:414D5120514D30312020202020202020FFFFFF4EFFFF6

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(){ 
    char name[41]="AMQ QM01  \275\364\250N\242\243\006"; 
    char buffer[82]=""; 
    char *pbuffer = buffer; 
    FILE *fp_1; 
    FILE *fp_2; 
    int size; 
    char *buffer_1 = NULL; 
    char *buffer_2 = NULL; 

    int rc = convertStrToHex(buffer, name); 
    printf("Result: %s\n", pbuffer); 
    } 
    return 0; 
} 

int convertStrToHex(char *buffer, char str[10]){ 
    int len = strlen(str); 
    int i; 

    for(i = 0; i < len ;i++){ 
     sprintf(buffer, "%X", str[i]); 
     buffer +=2; 
    }; 
} 

感謝您的幫助:-)

林頓

+0

是那裏的轉義序列? C sprintf如何處理它們?另外,爲什麼char * pbuffer = buffer?只需在printf中使用'buffer'... –

+0

@AaronGage:它們是八進制字符。 –

+0

你真的應該在調用之前爲'convertStrToHex'指定一個原型。將定義(它本身就是一個原型)移動到'main'之前或者在包含之後添加純原型:'int convertStrToHex(char *,char *);' – pmg

回答

0

正如一些其他的答案已經指出的,你需要的字符轉換爲unsigned char避免其被用FF填補填補字節的32位int的價值。但實際上還有另外一個問題:最後的唯一編號6只會在輸出中打印爲一個字符。你希望每個字符佔據兩個位置,所以你需要一個零填充字段說明符。把它放在一起,你得到

sprintf(buffer, "%02X", (unsigned char)str[i]); 
+0

感謝大家,你真的幫了很多! –

1

取決於編譯器和平臺的炭簽署否則printf的行爲是不同的。

只需將str [i]投射到unsigned char(或更改函數原型中的str類型),它就可以工作。例如(原型改變):

int convertStrToHex(char *buffer, unsigned char str[10]){ 
    int len = strlen(str); 
    int i; 

    for(i = 0; i < len ;i++){ 
     sprintf(buffer, "%X", str[i]); 
     buffer +=2; 
    }; 
} 

順便說一句:它視爲不安全經過而不它的分配長度並用sprintf的字符串。你應該使用snprintf和真正的緩衝區長度,或者至少在循環中處理大小限制。在strlen(str)大於緩衝區大小* 2的情況下。

0

嘗試

sprintf(buffer, "%X", (unsigned char)str[i]); 
相關問題