【问题标题】:Convert byte array to short array in C#在 C# 中将字节数组转换为短数组
【发布时间】:2009-07-09 15:23:28
【问题描述】:

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

我该怎么做呢?

【问题讨论】:

  • 您想将 1 个字节转换为 1 个短字节,还是将 2 个字节转换为 1 个短字节?

标签: c# bytearray


【解决方案1】:

使用Buffer.BlockCopy

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

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

这是迄今为止最快的方法。

【讨论】:

  • 我不应该得到的解决方案,但我现在需要的解决方案!
  • 谢谢!很好的答案,但我不得不将代码稍微更改为:short[] sdata = new short[(int)Math.Ceiling(data.Length / 2.0)];。否则,我会收到以下错误:“以下方法或属性之间的调用不明确:'Math.Ceiling(decimal)' 和 'Math.Ceiling(double)'”
【解决方案2】:

一种可能性是使用Enumerable.Select

byte[] bytes;
var shorts = bytes.Select(b => (short)b).ToArray();

另一个是使用Array.ConvertAll:

byte[] bytes;
var shorts = Array.ConvertAll(bytes, b => (short)b);

【讨论】:

  • 您最初的建议(在您稍后添加第二个之前)效率很低
  • 另一个选项是 bytes.Cast().ToArray();
  • 实际上,这会导致 InvalidCastException。简短的解释是,这段代码隐式地导致一个装箱的字节被拆箱为一个短的,这不是一个有效的拆箱操作。详情请见stackoverflow.com/questions/445471/…
  • 当我使用 var shorts[] = Array.ConvertAll(bytes, b => (short)b);我将每个字节转换为一个短字节,而不是转换为每对字节。
【解决方案3】:

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

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

【讨论】:

  • 这不起作用。您必须这样做才能使其工作:short s = (short)((bytes[0]
  • 假设小端,这应该是:short s = (short)(bytes[0] | (bytes[1]
【解决方案4】:
short value = BitConverter.ToInt16(bytes, index);

【讨论】:

  • 这个使用 index 作为 LSB, index+1 作为 MSB。有没有跟随 BigEndian 使用 index 作为 MSB?
  • 你读过这个问题吗?它是关于 byte[] 到 short[] 不短。
【解决方案5】:

我不知道,但我会期待另一种方法来解决这个问题。 将字节序列转换为短裤序列时,我会像 @Peter 那样完成

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

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

取决于文件中字节的字节序。

但是OP没有提到他对短裤的使用或文件中短裤的定义。 在他的情况下,将字节数组转换为短数组是没有意义的,因为它会占用两倍的内存,而且我怀疑在其他地方使用时是否需要将字节转换为短数组。

【讨论】:

    【解决方案6】:
     short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b);
    

    【讨论】:

    • 在我看来,这会将每个字节转换为一个短字节,这可能不是预期的结果,因为两个字节代表一个短字节 ;-)
    【解决方案7】:
    byte[] bytes;
    var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray();
    

    【讨论】:

    • 效率极低:为每个元素调用 convert.ToInt16(),将其存储在临时列表中,然后将其复制到新数组中。
    • 是的,效率低下。我认为它更安全,但是,然后铸造。
    • 比铸造更安全?将字节转换为短格式总是有效的。它永远不会抛出异常
    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 2018-05-27
    • 2012-06-04
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多