質問

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

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ではなく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);
}

他のヒント

BitConverter

を使用します
short number = 42;
byte[] numberBytes = BitConverter.GetBytes(number);
short converted = BitConverter.ToInt16(numberBytes);

バイトは4ではなく8ビットなので、シフトはオフです。また、2番目の関数でローカル変数を宣言したため、意図したとおりに out パラメーターを記述しないようにします。可能な場合は、ビット単位の操作(&amp; | 、および)に制限すると、より明確/優れたものになります。

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);
}

厳密に言えば、左右のゼロシフトは不要です。対称性のためにそれらを配置しました。また、個人的には、ビット演算のコールドを学び、これらのようなヘルパー関数の作成をスキップすることをお勧めします。根本的なもの、IMHOで詳細を隠す必要はありません。

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

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;
}

System.BitConverter

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top