在 .Net Core 中的大端字节序处理

7

是否有一个BitConverter或其他支持.Net Core的类,可以将整数和其他值读取为大端编码的形式?

我不太满意需要编写一组帮助方法:

int GetBigEndianIntegerFromByteArray(byte[] data, int startIndex) {
    return (data[startIndex] << 24)
         | (data[startIndex + 1] << 16)
         | (data[startIndex + 2] << 8)
         | data[startIndex + 3];
}
3个回答

10
自从.NET Core 2.1版本以来,静态类System.Buffers.Binary.BinaryPrimitives中有一个统一的API用于此目的。
它包含了针对ReadOnlySpan和原始类型(short/ushort,int/uint,long/ulong)的直接反向字节序的API。
private void GetBigEndianIntegerFromByteArray(ReadOnlySpan<byte> span,int offset)
{
    return BinaryPrimitives.ReadInt32BigEndian(span.Slice(offset));
}

System.Buffers.Binary.BinaryPrimitives类是.NET Core 2.1的一部分,不需要任何NuGet包。

此外,这个类包含Try...方法。


而且更好的是,这是 .Net Standard!感谢您遇到这个老问题! - Matt DeKrey

0

3
是的,不幸的是,正如源代码所表明的那样,这仅适用于构建系统的“字节序”;它不总是大端或小端。如果您在同一系统上使用相同的应用程序进行读写,则可以正常工作,但是一旦更改了dnx环境,就不能信任保存文件。 - Matt DeKrey

0
using System;
using System.Linq;

int GetBigEndianIntegerFromByteArray(byte[] data, int startIndex) 
{
    if (BitConverter.IsLittleEndian)
    {
        return BitConverter.ToInt32(data.Skip(startIndex).Take(sizeof(int)).Reverse().ToArray(), 0);
    }

    return BitConverter.ToInt32(data, startIndex);
}

另一种非常易读的方法是只使用Int32,但这种方法的缺点是使用更多的内存并且可能更慢。此时,我真的很想看到一个 .Net Standard 库(1.0,因为BitConverter在那里可用),无论是由Microsoft还是其他OSS库来解决这个问题集。 - Matt DeKrey
@MattDeKrey,我同意。那么 IPAddress.HostToNetworkOrder 呢? - moien
不幸的是,“网络序”始终是“最重要的字节优先”。(根据https://learn.microsoft.com/de-de/dotnet/api/system.net.ipaddress.networktohostorder)-否则,它会很适合。 - Matt DeKrey

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