11

バイトのペアを取り込んでショートを出力し、ショートを取り込んでバイトのペアを出力する必要があります。そのような目的のために私が考案した関数は次のとおりです。

static short ToShort(short byte1, short byte2)
{
    short number = (short)byte2;
    number <<= 4;
    number += (short)byte1;
    return number;
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte byte2 = (byte)(number >> 4);
    short tempByte = (short)byte2 << 4;
    byte byte1 = (byte)(number - tempByte);
}

これは正しいと思いますが、よくわかりません。これが正しい方法ではない場合、何ですか?フレームワークですでにこれを行う方法はありますか?

4

5 に答える 5

37

BitConverterを使用する

short number = 42;
byte[] numberBytes = BitConverter.GetBytes(number);
short converted = BitConverter.ToInt16(numberBytes);
于 2009-09-18T04:42:15.870 に答える
24

短いバージョン(4ビットではなく8ビットもシフト):

static short ToShort(short byte1, short byte2)
{
    return (byte2 << 8) + byte1;
}

static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte2 = (byte)(number >> 8);
    byte1 = (byte)(number & 255);
}
于 2009-09-18T04:32:06.087 に答える
5

バイトは4ビットではなく8ビットであるため、シフトはオフになっています。outまた、2番目の関数でローカル変数を宣言したので、意図したとおりにパラメーターを記述してしまうことはありません。また、可能な場合はビット単位の演算(、、、および)に制限すると、より明確&|なり~ます。

static short ToShort(byte byte1, byte byte2)
{
    return (short) ((byte2 << 8) | (byte1 << 0));
}

static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte2 = (byte) (number >> 8);
    byte1 = (byte) (number >> 0);
}

厳密に言えば、ゼロによる左右のシフトは不要であることに注意してください。対称にするためにそれらを入れました。また、個人的には、ビット単位の算術風邪を学び、このようなヘルパー関数の記述をスキップすることをお勧めします。とても基本的なもの、私見で詳細を隠す必要はありません。

于 2009-09-18T04:31:45.153 に答える
4

バイトを取得したい場合...バイトを取得します。シフトがオフになり、|より直感的になります。

static short ToShort(byte byte1, byte byte2)
{   // using Int32 because that is what all the operations return anyway...
    return (short)((((int)byte1) << 8) | (int)byte2);
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte1 = (byte)(number >> 8); // to treat as same byte 1 from above
    byte2 = (byte)number;
}
于 2009-09-18T04:35:47.817 に答える
0

System.BitConverter

于 2009-09-18T04:39:15.237 に答える