Bayt dizisi/char dizisini C cinsinden onaltılık dizeye dönüştürme

Bayt dizileri ve karakter dizileri konusundaki anlayışımın bazı sorunlara yol açtığını düşünüyorum, işte benim sorunum:

Websphere MQ'dan mesajlar çeken ve bunları bir hedef sisteme gönderen bir uygulamam var.

Bir MQ mesajı, mesajın MSGID'sini temsil eden bir MQBYTE24'e (esas olarak bayt dizisi 24) sahiptir. Amacım bunu bir hexidecimal dizeye dönüştürmektir.

My Linux box ileti lindeki WMQ explorer'da, sıradaki "AMQ QM01" mesajının bir tanımlayıcısı vardır (en azından göründüğü gibi) ve baytlar kaşifte gösterildiği gibi aşağıdadır:

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...         |

Şimdi kodum çalıştığı zaman aynı mesaj kimliğini alıyorum ve bir hex dizesine dönüştürmeyi deniyorum.

Hata ayıklama sırasında tam mesaj kimliği:

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

Ve dönüşümümden geçtikten sonra (aşağıdaki kod) şunu elde ederim:

414D5120514D30312020202020202020FFFFFF4EFFFF6

Gördüğünüz gibi, WMQ Explorer'ın gösterdiği birinden biraz farklı, burada ne yapıyorum?

Sanırım MQBYTE24'ten char'a dönüştürmekteyim ... bir şeyler ters gidiyor ...

Aşağıda "yanlış sonuç" üreten küçük bir örnek programdır ..... Ben char yerine bir bayt dizisi kullanmalıyım?

Aşağıdakiler için çıktı:

Sonuç: 414D5120514D30312020202020202020FFFFFF4EFFFF6

#include 
#include 
#include 

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;
    };
}

Yardım için teşekkürler :-)

Lynton

4
Bu sadece bir test programı .... Ben normalde prototip var ;-)
katma yazar Lynton Grice, kaynak
Gerçekten, gerçekten çağırmadan önce convertStrToHex için bir prototip belirtmelisiniz. main 'dan önce (kendi başına bir prototip görevi görür) tanımlamayı ya da içerden sonra düz prototipini ekleyin: int convertStrToHex (char *, char *);
katma yazar pmg, kaynak
@AaronGage: Onlar sekizli karakter kaçarlar.
katma yazar Ernest Friedman-Hill, kaynak
oradaki kaçış dizileri mi? C sprintleri bunları nasıl ele alıyor? Ayrıca, neden char * pbuffer = buffer? printf içinde sadece 'buffer' kullanın ...
katma yazar Aaron Gage, kaynak

3 cevap

Derleyiciye ve platforma bağlı olarak char imzalanır veya verilmez ve printf'in davranışı farklıdır.

Sadece str [i] imzasız char (ya da fonksiyonun prototipindeki str türünü değiştir) atar ve işe yarayacaktır. Örneğin (prototip değişti):

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;
    };
}

BTW: tahsis edilen uzunluk olmaksızın ve sprintf kullanmak için bir dizgeyi geçmek güvensiz olarak kabul edilir. Snprintf'i gerçek tampon uzunluğuyla kullanmanız veya en azından boyut limitini döngü içinde tutmanız gerekir. Strlen (str) durumunda tamponun boyutundan daha büyüktür * 2.

2
katma

Diğer birçok yanıtın da işaret ettiği gibi, karakterleri 32 bit int değerinde bayt doldurmak için FF ile doldurulmasını önlemek için imzasız char 'a çevirmeniz gerekir. Ama aslında başka bir sorun var: sonunda 6 olan yalnız sayı, çıktıda sadece bir karakter olarak basılacaktır. Her karakterin tam olarak iki pozisyon almasını istiyorsunuz, bu yüzden sıfır doldurulmuş bir alan belirticisine ihtiyacınız var. Hepsini bir araya getirmek

sprintf(buffer, "%02X", (unsigned char)str[i]);
1
katma
Hepinize çok yardımcı oldunuz!
katma yazar Lynton Grice, kaynak

Deneyin

sprintf(buffer, "%X", (unsigned char)str[i]);
1
katma