1

バイト配列を 16 進数文字列に変換する方法を検討しています。ここでコーディングしたものを次に示します。

unsigned char buffer[] = {0xAA,0xBB,0x01,0xAB,0x11,0x12,0x13,0x22,0x11,0x14};


int _tmain(int argc, _TCHAR* argv[])
{

                char * asta = (char*)malloc(16);
                memset(asta,0,16);
                int k;
                for (k = 0; k < 16 ; k++)
                {
                    sprintf(&asta[k],"%X",buffer[4 + k]);
                }

                printf("%s",asta);

    _getch();
}

最初のバイトのみが正しく変換され、残りは正しく変換されません。コードを修正するにはどうすればよいですか?

4

2 に答える 2

4

配列には 10 バイトあるため、バッファーには少なくとも 21 バイトが必要です (各バイトに 2 つの 16 進数 + ヌル ターミネータに 1 が必要です)。

あなたがここで何をしているのかわかりません:

sprintf(&asta[k],"%X",buffer[4 + k]);

バッファの 5 番目のバイトから開始するのはなぜですか? また、バッファ内の各バイトは文字列で 2 バイトを使用するため、に出力する必要がありますasta[2 * k]

まとめると次のようになります。

char * asta = (char*)calloc(2 * sizeof buffer + 1, sizeof(char)); // calloc automatically zeros asta
int k;
for (k = 0; k < sizeof buffer ; k++)
{
    sprintf(&asta[2 * k],"%02X", (unsigned int)buffer[k]); // Not sure if the cast is needed
}
printf("%s",asta);
于 2012-06-18T11:15:38.930 に答える
1

文字列として印刷する場合、2桁の16進数は2桁のままであることに注意する必要があります。つまり、2文字を使用します。

ループでは、2回目の反復で文字列の2番目の文字が上書きされ、3回目の反復で3番目の文字が上書きされます。

また、2桁の数字はそれぞれ2文字を使用するため、32文字にメモリを割り当て、さらに文字列の終了'\0'文字に1文字を割り当てる必要があります。

コメントに記載されているように、アレイの外部のデータにアクセスしています。

于 2012-06-18T11:09:56.240 に答える