1

シナリオ:

8 ビットの符号付き整数をエンコードする 16 進文字の文字列があります。各 2 文字は、符号として (2 の補数ではなく) 左端 (MSB) ビットを使用するバイトを表します。これらをループ内で符号付き int に変換していますが、それを行うためのより良い方法があるかどうか疑問に思いました。変換が多すぎて、もっと効率的な方法が欠けていると確信しています。

現在のコード:

string strData = "FFC000407F"; // example input data, encodes: -127, -64, 0, 64, 127
int v;
for (int x = 0; x < strData.Length/2; x++)
{
    v = HexToInt(strData.Substring(x * 2, 2));
    Console.WriteLine(v); // do stuff with v
}

private int HexToInt(string _hexData)
{
    string strBinary = Convert.ToString(Convert.ToInt32(_hexData, 16), 2).PadLeft(_hexData.Length * 4, '0');
    int i = Convert.ToInt32(strBinary.Substring(1, 7), 2);
    i = (strBinary.Substring(0, 1) == "0" ? i : -i);
    return i;
}

質問:

左端のビットを符号として使用して、符号付き int (-127 から 127) を表す場合に、2 つの 16 進文字を読み取り、それらを int に変換する、より合理的で直接的な方法はありますか?

4

3 に答える 3

3

それをintに変換し、変換された数値のサイズをテストし、符号ビットをマスキングして符号ビットを処理します。

private int HexToInt(string _hexData)
{
    int number = Convert.ToInt32(_hexData, 16);
    if (number >= 0x80)
       return -(number & 0x7F);
    return number;
}
于 2010-04-27T00:54:40.693 に答える
1
sbyte SignAndMagnitudeToTwosComplement(byte b)
{
    var isNegative = ((b & 0x80) >> 7);
    return (sbyte)((b ^ 0x7F * isNegative) + isNegative);
}

それで:

sbyte ReadSignAndMagnitudeByte(string hex)
{
    return SignAndMagnitudeToTwosComplement(Convert.ToByte(hex,16));
}
于 2010-04-27T01:23:50.630 に答える
1

このように:(テスト済み)

(int)unchecked((sbyte)Convert.ToByte("FF", 16))

説明:

へのuncheckedキャストsbyteは、符号付きバイトへの直接キャストを実行し、最終ビットを符号ビットとして解釈します。

ただ、範囲が違うので役に立ちません。

于 2010-04-27T00:55:16.513 に答える