在C#中高效读取大端数据的方法

11
我使用以下代码来使用BinaryReader读取BigEndian信息,但我不确定这是否是高效的方法。是否有更好的解决方案?
这是我的代码:

我使用以下代码来使用BinaryReader读取BigEndian信息,但我不确定这是否是高效的方法。是否有更好的解决方案?

这是我的代码:

// some code to initialize the stream value
// set the length value to the Int32 size
BinaryReader reader =new BinaryReader(stream);
byte[] bytes = reader.ReadBytes(length);
Array.Reverse(bytes);
int result = System.BitConverter.ToInt32(temp, 0);
3个回答

12

BitConverter.ToInt32并不是很快,因此我会简单地使用

public static int ToInt32BigEndian(byte[] buf, int i)
{
  return (buf[i]<<24) | (buf[i+1]<<16) | (buf[i+2]<<8) | buf[i+3];
}

你也可以考虑一次读取超过4个字节。


谢谢。这非常有趣,但为了确保我正确理解了这个想法,您能解释一下我们如何读取超过4个字节吗? - Hossein Narimani Rad
1
只需使用更大的长度调用ReadBytes,然后使用不同的i在数组中的不同位置读取整数。但这是一种优化,您应该在基准测试之后才能采取。 - CodesInChaos
是的,我在我的一些项目中使用过类似的东西(尽管不是在C#中)。但我本来期望BinaryReader/Writer内置了字节序控制,这将使它更简单。 - Stewart

3

自2019年起(实际上是从.net core 2.1开始),现在有了

byte[] buffer = ...;

BinaryPrimitives.ReadInt32BigEndian(buffer.AsSpan());

文档

实现


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接