Cでバイト配列/文字配列を16進文字列に変換する

私はバイト配列とchar配列の私の理解が私にいくつかの問題を引き起こしていると思う、ここで私の問題です:

私はWebsphere MQからメッセージを引き出し、それらをターゲットシステムに送るアプリケーションを持っています。

MQメッセージには、メッセージのMSGIDを表すMQBYTE24(本質的にバイト配列24)があります。私の目標は、これを16進文字列に変換することです。

私のLinuxボックス上のWMQエクスプローラでは、キュー内のメッセージ1にメッセージ識別子が "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を拾い、それを16進文字列に変換しようとします。

デバッグ中の正確なメッセージIDは次のとおりです。

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

私の変換(以下のコード)を実行した後、私は次のようになります:

414D5120514D30312020202020202020FFFFFF4EFFFF6

あなたが見ることができるように、それはWMQ Explorerが示すものとは少し異なります、私がここで間違っていることは何ですか?

私はMQBYTE24からcharに変換していると思います...何かが間違っている...

以下は "間違った結果"を生成する小さなサンプルプログラムです.....私はcharの代わりにバイト配列を使用する必要がassune?

次の出力は次のとおりです。

結果: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;
    };
}

助けてくれてありがとう :-)

リントン

4
それは単なるテストプログラムです...私は通常プロトタイプを持っています;-)
追加された 著者 Lynton Grice,
実際には、それを呼び出す前に convertStrToHex のプロトタイプを指定する必要があります。 main の前に定義を移動するか( main の前にプロトタイプとして動作させる)、インクルード後にプレーンプロトタイプを追加してください: int convertStrToHex(char *、char *);
追加された 著者 pmg,
@AaronGage:8進文字のエスケープです。
追加された 著者 Ernest Friedman-Hill,
そこにエスケープシーケンスがありますか? C sprintfはどのようにそれらを処理していますか?また、なぜchar * pbuffer =バッファですか? printfで 'buffer'を使うだけです...
追加された 著者 Aaron Gage,

3 答え

コンパイラとプラットフォームに応じて、charは署名されているかどうかに依存し、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より大きい場合

2
追加された

他のいくつかの回答が既に指摘しているように、文字を32ビット整数のバイトを埋めるために FF で埋め込まないようにするには、文字を unsigned char にキャストする必要があります。実際には別の問題があります。最後の 6 という数字は、出力の1文字としてのみ印刷されます。それぞれのキャラクターが正確に2つのポジションを取るようにしたいので、ゼロ埋め込みのフィールド指定子が必要です。すべて一緒に置くと、あなたは得る

sprintf(buffer, "%02X", (unsigned char)str[i]);
1
追加された
皆さんのおかげで、本当に助けになりました!
追加された 著者 Lynton Grice,

試す

sprintf(buffer, "%X", (unsigned char)str[i]);
1
追加された