我需要从一个短整数值编码一个字节数组 编码规则是 代表整数的位是0-13位 如果数字为负,则设置位14 位15始终为1。 我知道我可以使用BitConverter将整数放入字节数组
byte[] roll = BitConverter.GetBytes(x);
但是我找不到满足我要求的方法 有人知道该怎么做吗?
答案 0 :(得分:2)
您应该使用Bitwise Operators。
解决方案是这样的:
Int16 x = 7;
if(x < 0)
{
Int16 mask14 = 16384; // 0b0100000000000000;
x = (Int16)(x | mask14);
}
Int16 mask15 = -32768; // 0b1000000000000000;
x = (Int16)(x | mask15);
byte[] roll = BitConverter.GetBytes(x);
答案 1 :(得分:2)
您不能依靠GetBytes来获取负数,因为它可以补充位,而这并不是您所需要的。
相反,您需要进行边界检查以确保该数字可表示,然后在给定数字的绝对值上使用GetBytes。
该方法的参数为'short',因此我们的GetBytes返回一个字节数组,其大小为2(您不需要超过16位)。
其余内容在下面的评论中:
static readonly int MAX_UNSIGNED_14_BIT = 16383;// 2^14-1
public static byte[] EncodeSigned14Bit(short x)
{
var absoluteX = Math.Abs(x);
if (absoluteX > MAX_UNSIGNED_14_BIT) throw new ArgumentException($"{nameof(x)} is too large and cannot be represented");
byte[] roll = BitConverter.GetBytes(absoluteX);
if (x < 0)
{
roll[1] |= 0b01000000; //x is negative, set 14th bit
}
roll[1] |= 0b10000000; // 15th bit is always set
return roll;
}
static void Main(string[] args)
{
// testing some values
var r1 = EncodeSigned14Bit(16383); // r1[0] = 255, r1[1] = 191
var r2 = EncodeSigned14Bit(-16383); // r2[0] = 255, r2[1] = 255
}