C# 短字节转换

C# 短字节转换,c#,C#,我正在尝试将一个短类型转换为2字节类型以存储在字节数组中,下面是“到目前为止”运行良好的代码段 数值_数据为int类型。在我处理数值284(十进制)之前,一切都很顺利。结果是284>>8是1而不是4 主要目标是: byte[0] = 28 byte[1] = 4 为什么284>>8会是4 为什么将284拆分为两个字节,分别等于28和4 284的二进制表示是0000 0001 0001 1100。如您所见,有两个字节(八位),分别为0000 0001(十进制为256)和0001 1100(十进制

我正在尝试将一个短类型转换为2字节类型以存储在字节数组中,下面是“到目前为止”运行良好的代码段

数值_数据为int类型。在我处理数值284(十进制)之前,一切都很顺利。结果是284>>8是1而不是4

主要目标是:

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

为什么
284>>8
会是
4

为什么将
284
拆分为两个字节,分别等于
28
4

284
的二进制表示是
0000 0001 0001 1100
。如您所见,有两个字节(八位),分别为
0000 0001
(十进制为
256
)和
0001 1100
(十进制为
28

284>>8
1
0000 0001
),它是正确的

284
应分成两个字节,分别等于
256
24

您的转换是正确的如果您坚持:

short val = 284;
byte a = (byte)(val / 10);
byte b = (byte)(val % 10);
免责声明:

这没有多大意义,但这是你想要的。我假设您想要0到99之间的值。合乎逻辑的做法是使用100作为分母,而不是10。但话说回来,我不知道你想做什么。

只是为了好玩:

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();
}
公共静态字节[]ToByteArray(短s)
{
//如果'short'可以转换为'byte',而不会溢出,则返回
if(s byte.MaxValue)//如果它仍然太大
δ*=10;
否则//找到字节后,中断循环
{
b=(字节)温度;
打破
}
}
//添加找到的字节
字节。添加(b);
//递归搜索数字的其余部分
AddRange(ToByteArray((短)(s%delta));
返回bytes.ToArray();
}

这种递归方法至少可以使用任何正的
short
值满足OP的需要。

这就是您要寻找的:

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

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

放弃正在使用的无意义转换,转到
System.BitConverter.ToInt16

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

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

您混淆了十六进制和十进制。您混淆了十进制和二进制。请检查,谢谢,但这并没有解决我仍然希望实现的任何问题:字节[0]=28(十进制)字节[1]=4(十进制),以短值为基数。在这种情况下,我的问题仍然悬而未决。为什么是28和4?为什么不是2和84呢?3284怎么了?转换的规则是什么?因为284表示缓冲区大小,我需要从该缓冲区的前2个字节指示大小,即284…这当然不能解释为什么不保留二进制表示,或者为什么除以10填充最低有效字节。我正在做的是发送一个包,前2个字节用于指示数据包len。经过所有的处理后,数据包的大小是284,所以前2个字节应该是284或0x11CAs。这里的其他人已经说过,你把十六进制和十二进制混在一起了。。。short val=0x284将给出原始代码的预期结果。。考虑到您没有看到这一点,我怀疑您只是从某个地方获取了代码?;)不,他不想那样,但是是的,这是正确的方法+1这是一个完美的答案,你如何用一句话就能做到?@ffenix:正如大家所说,这是错误的做法。(对不起,这里没有一行,我的错)我仍然不知道为什么用错误的方式,客户希望这样,不,它不是十六进制,VisualStudio以十进制显示所有内容。所以是的,这就是我需要的。@ffenix请下次再检查一下……您的原始代码确实使用了字节(如ja72的答案)
  //to bytes
  var buffer = System.BitConverter.GetBytes(284); //your short value

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