短整型转字节的转换

3
我正在尝试将short类型转换为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(十进制)的值时出现了问题。结果发现,284 >> 8 的值是 1,而不是 4。

主要目标是:

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

2
您混淆了十六进制和十进制。 - leppie
1
你混淆了十进制和二进制。 - Richard Schneider
请查看以下链接:https://dev59.com/FG025IYBdhLWcg3w4Z-u - spajce
5个回答

4

这是您在寻找的内容吗:

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

        byte[] bytes=BitConverter.GetBytes(data);
        // bytes[0] = 28
        // bytes[1] = 1
    }

不,他不想要那个,但是是的,这是正确的做法。+1 - leppie

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所需的操作。


这是完美的答案,你怎么能用一行代码实现呢? - ffenix
@ffenix:就像大家所说的,这不是正确的做法。(抱歉,这里不只有一行,我的错) - leppie
我仍然不知道为什么是错误的方式,客户期望这样做,而且它不是十六进制,Visual Studio 在十进制下显示所有内容。所以是的,这就是我需要的。 - ffenix
1
@ffenix,请再检查一下……你原来的代码确实使用了字节(就像ja72的答案中所示)。 - horgh

1
放弃你正在使用的无意义的转换方式,改用 System.BitConverter.ToInt16
  //to bytes
  var buffer = System.BitConverter.GetBytes(284); //your short value

  //from bytes
  var value = System.BitConverter.ToInt16(buffer, 0);

1
为什么284 >> 8会得到4
为什么284要分成两个相等的字节,即284284的二进制表示是0000 0001 0001 1100。如您所见,有两个字节(八位),分别是0000 0001(在十进制中为256)和0001 1100(在十进制中为28)。 284 >> 810000 0001),这是正确的。 284应该分成两个相等的字节,即25624您的转换是正确的!

谢谢,但那并没有解决或帮助我任何方式,我仍然想要实现:byte[0] = 28(十进制) byte[1] = 4(十进制)以一个short值的基础。 - ffenix
在这种情况下,我的问题仍然没有答案。为什么是28和4呢?为什么不是2和84呢?3284会发生什么?转换的规则是什么? - ybo
因为284表示缓冲区大小,我需要从该缓冲区中获取前两个字节以指示大小,即284... - ffenix
这当然无法解释为什么您不保留二进制表示,或者为什么要除以10来填充最低有效字节。 - ybo

1
如果你坚持的话:

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

免责声明:

这并没有太多意义,但这是你想要的。我假设你想要从0到99的数值。逻辑上来说,使用100作为分母而不是10是更明智的选择。但是,我不知道你想要做什么。


我正在做的是发送一个数据包,前两个字节用于指示数据包长度。在所有处理完成后,数据包大小为284,因此前两个字节应该是284或0x11C。 - ffenix
3
就像这里其他人已经说过的,你混淆了十六进制和十进制...使用原始代码中的 short val = 0x284 将会得到预期的结果。考虑到你没有看出这一点,我怀疑你只是从某个地方复制了这段代码?;) - Roger Johansson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接