3

Tibor Kiss (下のリンク) によって作成された単純な C 関数を見ています。1 つのバイナリ バイトを 2 つの 16 進文字に変換するには、「W」(0x57) を追加する必要があることを理解しようとしています。なぜこれが行われているのですか?

>> は文字 c を右に 4 桁シフトする (左側のビットを 0 で埋める) ことを理解しています。また、ビットごとの AND を使用して x の上位 4 ビットをマスクするだけの x=c&0x0f 部分も理解しています。

バイナリ バイトを 16 進数に変換するために ASCII 'W' (0x57) を追加する必要がある理由がわかりません。

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en543105

/******************************************************************************
 * Function:        void btoh(unsigned char c,char *str)
 *
 * PreCondition:    None
 *
 * Input:           str - pointer to the zero terminated string
 *                  c   - byte to convert
 *
 * Output:          None
 *
 * Side Effects:    None
 *
 * Overview:        Convert one byte to a 2 character length hexadecimal
 *                  zero terminated string
 *
 * Note:            Using static variable for less code size
 *****************************************************************************/
void btoh(unsigned char c,char *str)
{
    static unsigned char x;
    x=c>>4;
    *str=x+(x>9?'W':'0');
    x=c&0x0f;
    str[1]=x+(x>9?'W':'0');
    str[2]=0;
}
4

2 に答える 2

9

彼が付け加えた理由'W'は、彼がこの表現を単純化したからです:

*str=x+(x>9? ('a'-10) :'0');

'W'彼は がであることを観察'a'-10し、簡略化された定数をコードに入力しました。ASCII テーブルを見ずに何が起こっているのかを理解するのは難しいため、これはあまり良い考えではありません。さらに、コンパイラは'a'-10とにかく式を同じ正確な値に単純化するため、読みやすさは失われ、特に利点はありません。

于 2013-08-11T21:44:13.400 に答える