3

バイト配列に格納するために、短い型を2バイト型に変換しようとしています。これは、「これまでのところ」うまく機能しているスニペットです。

if (type == "short")
{
   size = data.size;
   databuffer[index+1] = (byte)(data.numeric_data >> 8);
   databuffer[index] = (byte)(data.numeric_data & 255);
   return size;
}

Numeric_data は int 型です。値284(10進数)を処理するまで、すべてうまくいきました。284 >> 8 は 4 ではなく 1 であることがわかります。

主な目標は次のとおりです。

byte[0] = 28
byte[1] = 4
4

5 に答える 5

3

これはあなたが探しているものですか:

    static void Main(string[] args)
    {
        short data=284;

        byte[] bytes=BitConverter.GetBytes(data);
        // bytes[0] = 28
        // bytes[1] = 1
    }
于 2013-02-08T06:58:50.743 に答える
2

楽しみのために:

public static byte[] ToByteArray(short s)
{
    //return, if `short` can be cast to `byte` without overflow
    if (s <= byte.MaxValue) 
        return new byte[] { (byte)s };

    List<byte> bytes = new List<byte>();
    byte b = 0;
    //determine delta through the number of digits
    short delta = (short)Math.Pow(10, s.ToString().Length - 3);
    //as soon as byte can be not more than 3 digits length
    for (int i = 0; i < 3; i++) 
    {
        //take first 3 (or 2, or 1) digits from the high-order digit
        short temp = (short)(s / delta);
        if (temp > byte.MaxValue) //if it's still too big
            delta *= 10;
        else //the byte is found, break the loop
        {
            b = (byte)temp;
            break;
        }
    }
    //add the found byte
    bytes.Add(b);
    //recursively search in the rest of the number
    bytes.AddRange(ToByteArray((short)(s % delta))); 
    return bytes.ToArray();
}

この再帰的メソッドは、少なくとも任意の正のshort値で OP が必要とすることを行います。

于 2013-02-08T06:57:59.320 に答える
1

なぜだろ284 >> 84

284に等しい2バイトに分割されるのはなぜですか?284

のバイナリ表現は284です0000 0001 0001 1100。ご覧のとおり、 ( 10進数)と( 10進数)の2バイト0000 0001( 8ビット)があります。2560001 110028

284 >> 810000 0001)であり、正しいです。

284とに等しい2バイトに分割する必要が256あり24ます。

あなたの変換は正しいです!

于 2013-02-08T06:29:15.463 に答える
1

使用しているナンセンスな変換を削除して、System.BitConverter.ToInt16

  //to bytes
  var buffer = System.BitConverter.GetBytes(284); //your short value

  //from bytes
  var value = System.BitConverter.ToInt16(buffer, 0);
于 2013-02-08T07:17:33.983 に答える
1

あなたが主張する場合:

short val = 284;
byte a = (byte)(val / 10);
byte b = (byte)(val % 10);

免責事項:

これはあまり意味がありませんが、それはあなたが望むものです。0 から 99 までの値が必要だと思います。分母として 10 ではなく 100 を使用するのが論理的です。

于 2013-02-08T06:41:26.267 に答える