C# 在ushort中编码字节,然后再返回
我正试图在一个ushort中存储两个字节。所以前8位是第一个值,最后8位是最后一个值。我几乎让它工作了,但我在第20行发现了这个错误,在那里我将移位:C# 在ushort中编码字节,然后再返回,c#,bit-manipulation,bit-shift,short,C#,Bit Manipulation,Bit Shift,Short,我正试图在一个ushort中存储两个字节。所以前8位是第一个值,最后8位是最后一个值。我几乎让它工作了,但我在第20行发现了这个错误,在那里我将移位: Severity Code Description Project File Line Suppression State Error CS0266 Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists (are
Severity Code Description Project File Line Suppression State
Error CS0266 Cannot implicitly convert type 'int' to 'ushort'. An explicit conversion exists (are you missing a cast?) Bit Stuff C:\Users\perqj\Dropbox\GM\Bit Stuff\Bit Stuff\Form1.cs 42 Active
代码如下:
byte val1 = 1;
byte val2 = 1;
byte[] val = new byte[2];
val[0] = val1;
val[1] = val2;
ushort asShort = BitConverter.ToUInt16(val, 0);
ushort mask1 = 0x00ff; //0b_0000_0000_1111_1111 Haven't tried, yet
ushort mask2 = 0xff00; //0b_1111_1111_0000_0000 Haven't tried, yet
ushort short1 = asShort;
ushort short2 = asShort;
ushort byteShift = 8;
short1 &= mask1;
short2 &= mask2;
short2 = short2 >> byteShift;
string binaryMask1 = Convert.ToString(mask1, 2);
string binaryMask2 = Convert.ToString(mask2, 2);
string binaryShort1 = Convert.ToString(short1, 2);
string binaryShort2 = Convert.ToString(short2, 2);
listBox1.Items.Add("val1: " + val1);
listBox1.Items.Add("val2: " + val2);
listBox1.Items.Add("Short: " + asShort);
listBox1.Items.Add("mask1: " + mask1 + " " + binaryMask1);
listBox1.Items.Add("mask2: " + mask2 + " " + binaryMask2);
listBox1.Items.Add("val1: " + short1 + " " + binaryShort1);
listBox1.Items.Add("val2: " + short2 + " " + binaryShort2);
我通常使用如下代码:
class Program
{
static void Main(string[] args)
{
byte[] input = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
Data[] output = input.Select((x,i) => new {x = x, i = i}).GroupBy(x => x.i/2).Select(x => new Data() { upper = x.First().x, lower = x.Last().x}).ToArray();
}
}
public class Data
{
public byte upper { get; set; }
public byte lower { get; set; }
}
是的,位移位的结果是
int
——但是正如错误所说,您可以添加一个强制转换:short2=(ushort)(short2>>byteShift)
您可能会发现short2>>=byteShift代码>也可以工作-这是等效的,只需使用隐式cast.Ahh。当然,位移位“返回”一个int。为什么我没想到呢。谢谢,现在起作用了。现在还不清楚这与这个问题有什么关系——问题在哪里可以通过演员阵容解决。