1

私はチャーを持っていbyte[0] = '1' (H'0x31)ますbyte[1] = 'C'(H'0x43)

1 つ以上のバッファーを使用して、さらにバフしますchar hex_buff[0]。これに 16 進数のコンテンツが必要ですhex_buff[0] = 0x1C(つまり、バイト [0] とバイト [1] の組み合わせ)。

以下のコードを使用していましたが、コードが16進値0〜9に対してのみ有効であることに気付きました

char s_nibble1 = (byte[0]<< 4)& 0xf0;

char s_nibble2 =  byte[1]& 0x0f;

hex_buff[0] = s_nibble1 | s_nibble2;// ここでは0x1C代わりに0x13

4

4 に答える 4

1

他の文字操作関数との依存関係なしで、それを行う可能な方法:

char hex2byte(char *hs)
{
    char b = 0;
    char nibbles[2];
    int i;

    for (i = 0; i < 2; i++) {
        if ((hs[i] >= '0') && (hs[i] <= '9')) 
            nibbles[i] = hs[i]-'0';
        else if ((hs[i] >= 'A') && (hs[i] <= 'F')) 
            nibbles[i] = (hs[i]-'A')+10;
        else if ((hs[i] >= 'a') && (hs[i] <= 'f')) 
            nibbles[i] = (hs[i]-'a')+10;
        else 
            return 0;
    }

    b = (nibbles[0] << 4) | nibbles[1];
    return b;
}

例: hex2byte("a1")byte を返します0xa1

あなたの場合、関数を次のように呼び出す必要がありますhex_buff[0] = hex2byte(byte)

于 2014-09-09T15:50:13.160 に答える
1

実際の値を減算するのではなく、文字コードのビットをマスクしてニブルを取得しようとしています。[0..9]範囲が切断されているため、これは機能しません。エンコードにとの間にギャップがある[A-F]ため、マスキングは失敗します。

これを修正するには、小さなヘルパー関数を追加し、それをコードで 2 回使用します。

int hexDigit(char c) {
    c = toupper(c); // Allow mixed-case letters
    switch(c) {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9': return c-'0';
        case 'A':
        case 'B':
        case 'C':
        case 'D':
        case 'E':
        case 'F': return c-'A'+10;
        default: // Report an error
    }
    return -1;
}

これで、次のように変換をコーディングできます。

int val = (hexDigit(byte[0]) << 4) | hexDigit(byte[1]);
于 2014-09-09T15:49:13.523 に答える
1

ASCII 16 進数を内部表現に変換しようとしているようです。

これを行うには多くの方法がありますが、各ニブルに最もよく使用する方法は次のとおりです。

int nibval(unsigned short x)
{
    if  (('0' <= x) && ('9' >= x))
    {
        return  x - '0';
    }
    if  (('a' <= x) && ('f' >= x))
    {
        return  x - ('a' - 10);
    }
    if  (('A' <= x) && ('F' >= x))
    {
        return  x - ('A' - 10);
    }

    //  Invalid input
    return  -1;
}

これは unsigned int パラメーターを使用するため、シングルバイト文字だけでなく wchar_t 文字でも機能します。

于 2014-09-09T15:52:15.487 に答える