C# 在C语言中将字节数组转换为短数组#

C# 在C语言中将字节数组转换为短数组#,c#,bytearray,C#,Bytearray,我目前正在读取一个文件,希望能够将从该文件获得的字节数组转换为短数组 我该怎么做呢?一种可能性是使用: 另一种是使用: shorthard是两个字节的复合词。如果您将所有的短消息作为真正的短消息写入文件,那么这些转换是错误的。您必须使用两个字节来获得真正的短值,使用类似于: short s = (short)(bytes[0] | (bytes[1] << 8)) short s=(short)(字节[0]|(字节[1])使用 以字节数组大小的一半创建短数组,并将字节数据复制到:

我目前正在读取一个文件,希望能够将从该文件获得的字节数组转换为短数组

我该怎么做呢?

一种可能性是使用:

另一种是使用:


shorthard是两个字节的复合词。如果您将所有的短消息作为真正的短消息写入文件,那么这些转换是错误的。您必须使用两个字节来获得真正的短值,使用类似于:

short s = (short)(bytes[0] | (bytes[1] << 8))
short s=(short)(字节[0]|(字节[1])使用

以字节数组大小的一半创建短数组,并将字节数据复制到:

short[] sdata = new short[(int)Math.Ceiling(data.Length / 2)];
Buffer.BlockCopy(data, 0, sdata, 0, data.Length);

这是目前为止最快的方法。

我不知道,但我本以为这个问题会有另一个答案。 当将一个字节序列转换成一个短序列时,我会像@Peter那样完成它

short s = (short)(bytes[0] | (bytes[1] << 8))

short s=(short)(bytes[0]|(bytes[1]您想将1个字节转换为1个短字节,还是将2个字节转换为1个短字节?这非常低效:调用convert.ToInt16()对于每个元素,将其存储在一个临时列表中,然后将其复制到一个新数组中。是的,这是低效的。我认为它比强制转换更安全。比强制转换更安全?将字节强制转换为短字节总是有效的。它永远不会抛出例外您最初的建议(在您稍后添加第二个建议之前)另一个选项是bytes.Cast().ToArray();实际上,这会导致InvalidCastException。简短的解释是,此代码会隐式地将已装箱的字节解除装箱到一个short,该short不是有效的解除装箱操作。有关详细信息,请参阅。当我使用var shorts[]=Array.ConvertAll(bytes,b=>(short)b)时;我将每个字节转换为一个短字节,而不是将每对字节转换为一个短字节。这不起作用。你必须这样做才能使它起作用:short s=(short)((字节[0]假设是小端,这应该是:short s=(short)(字节[0]|)(字节[1]我不应该得到的解决方案,但我现在需要的解决方案!谢谢!回答得很好,但我不得不将代码稍微更改为:short[]sdata=new short[(int)Math.天花(data.Length/2.0)];。否则,我会得到以下错误:“调用在以下方法或属性之间不明确:'Math.天花(decimal)'和'Math.Ceiling(double)'“这一个使用索引作为LSB,索引+1作为MSB。是否有一个遵循BigEndian使用索引作为MSB?您甚至读过这个问题吗?这是关于字节[]到短[]的问题,不是短的。在我看来,这会将每个字节转换为短的,这可能不是预期的结果,因为两个字节代表短;-)
byte[] bytes;
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray();
short s = (short)(bytes[0] | (bytes[1] << 8))
short value = BitConverter.ToInt16(bytes, index);
short[] sdata = new short[(int)Math.Ceiling(data.Length / 2)];
Buffer.BlockCopy(data, 0, sdata, 0, data.Length);
short s = (short)(bytes[0] | (bytes[1] << 8))
short s = (short)((bytes[0] << 8) | bytes[1])