2

CでHEXをASCII変換に変換する私のロジックは次のとおりです。

for (i=0;i<ArraySize;i++)
    {
        /*uses a bitwise AND to take the top 4 bits from the byte,
         0xF0 is 11110000 in binary*/
        char1 = Tmp[i] & 0xf0;
        char1 = char1 >> 4;
        /*bit-shift the result to the right by four bits (i.e. quickly divides by 16)*/
        if (char1 >9)
        {
            char1 = char1 - 0xa;
            char1 = char1 + 'A';
        }
        else
        char1 = char1 + '0';
        Loc[j]=char1;
        j++;
        /*means use a bitwise AND to take the bottom four bits from the byte,
        0x0F is 00001111 in binary*/
        char1 = Tmp[i] & 0x0f;
        if (char1 >9)
        {
            char1 = char1 - 0xa;
            char1 = char1 + 'A';
        }
        else
        char1 = char1 + '0';
        Loc[j]=char1;
        j++;
        Loc[j]=0;
    }

Temp と Loc は文字列バッファです。定義され、データがあります。正常に動作していません。いくつかのファイルから一時的にデータを読み取っています (サンプル fread)。特定の時点でファイルの読み取りを停止します。私が先に変われば

0xf0

0x0f

ファイルの読み取り方法は次のとおりです。

BytesRead = fread (Tmp,1,Bytes,PrcFile);

次に、ファイル全体を読み取ります。足りないものを見つけることができません。この点で私を助けてください。ありがとう

4

2 に答える 2

2

これは答えではなく観察です-コードをフォーマットするのでこれを使用します

static char lookup[] = { '0', '1', '2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
int j = 0;
for (i=0; i<ArraySize; ++i)
{
   loc[j++] = lookup[(Tmp[i] & 0xf0) >> 4];
   loc[j++] = lookup[Tmp[i] & 0xf];
}
loc[j] = 0;

コードをより迅速かつ簡単にします。

于 2012-02-10T11:57:13.820 に答える
0

エドはすでに短い解決策を提供していましたが、コードが「正しく見えた」ため、何が問題なのかを理解しようとしました。

推測させてください:char1は署名されています(たとえば、タイプ「char」)。

次に、次のことが起こります。

  • >127 であるファイル内のバイトは&0xf0

  • >> 4ビットパターンがビットセットを最上位ビットに保持するようにする符号付きシフトです

  • >9次に、符号ビットがまだ設定されているため、どちらが当てはまらないかを比較します

  • +'0'次に、「0」から「9」または「A」から「F」の間の値ではなく、値が0のバイトを持つようになる可能性があることを追加します。

  • 印刷中に文字列を終了する

于 2012-02-10T12:08:20.493 に答える