我正在尝试将一个短类型转换为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
答案 0 :(得分:3)
这就是你要找的东西:
static void Main(string[] args)
{
short data=284;
byte[] bytes=BitConverter.GetBytes(data);
// bytes[0] = 28
// bytes[1] = 1
}
答案 1 :(得分: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();
}
这种递归方法执行OP所需的至少任何正short
值。
答案 2 :(得分:1)
为什么284 >> 8
会4
?
为什么284
会被分成等于28
和4
的两个字节?
284
的二进制表示形式为0000 0001 0001 1100
。如您所见,有两个字节(8位)为0000 0001
(十进制为256
)和0001 1100
(十进制为28
)。
284 >> 8
是1
(0000 0001
),这是正确的。
284
应分为两个字节,分别为256
和24
。
您的转换是正确的!
答案 3 :(得分:1)
如果你坚持:
short val = 284;
byte a = (byte)(val / 10);
byte b = (byte)(val % 10);
免责声明:
这没有多大意义,但这正是你想要的。我假设你想要0到99之间的值。合乎逻辑的做法是使用100作为分母而不是10.然后再说,我不知道你想做什么。
答案 4 :(得分:1)
删除您正在使用的无意义转换,然后转到System.BitConverter.ToInt16
//to bytes
var buffer = System.BitConverter.GetBytes(284); //your short value
//from bytes
var value = System.BitConverter.ToInt16(buffer, 0);