Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core Net内核中的大端处理_Asp.net Core_.net Core - Fatal编程技术网

Asp.net core Net内核中的大端处理

Asp.net core Net内核中的大端处理,asp.net-core,.net-core,Asp.net Core,.net Core,是否有位转换器或其他支持.Net内核的类,我可以将整数和其他值读取为具有Big-Endian编码 我对需要编写一组助手方法感觉不好: int GetBigEndianIntegerFromByteArray(byte[] data, int startIndex) { return (data[startIndex] << 24) | (data[startIndex + 1] << 16) | (data[startIndex

是否有
位转换器
或其他支持.Net内核的类,我可以将整数和其他值读取为具有Big-Endian编码

我对需要编写一组助手方法感觉不好:

int GetBigEndianIntegerFromByteArray(byte[] data, int startIndex) {
    return (data[startIndex] << 24)
         | (data[startIndex + 1] << 16)
         | (data[startIndex + 2] << 8)
         | data[startIndex + 3];
}
int-GetBigEndianIntegerFromByteArray(字节[]数据,int-startIndex){

return(data[startIndex]包中存在具有方法的类。

自.NET Core 2.1以来,在静态类中有一个统一的APISystem.Buffers.Binary.BinaryPrimitives

它包含用于ReadOnlySpan的API和用于基本类型(short/ushort、int/uint、long/ulong)的直接反向endianness

private void GetBigEndianIntegerFromByteArray(ReadOnlySpan span,int offset)
{
返回BinaryPrimitives.ReadInt32BigEndian(span.Slice(offset));
}
System.Buffers.Binary.BinaryPrimitives类是.NET Core 2.1的一部分,不需要NuGet包


这个类还包含Try…方法

是的,不幸的是,正如源代码所示,这只适用于“endianess”对于内置的系统,它并不总是Big-Endian或Little-Endian。如果您在同一系统上使用相同的应用程序进行读写,这很好,但是一旦更改dnx环境,您就不能信任保存文件。另一种非常可读的方法是Int32,尽管这种方法的缺点是使用更多内存和内存d可能会慢一点。现在,我真的很想看到一个.Net标准库(1.0,因为那里有位转换器),无论是由Microsoft还是其他OSS库生成的,都可以处理这个问题集。@MattDeKrey,我同意。那么IPAddress.HostToNetworkOrder呢?不幸的是,“网络顺序”总是“最重要的字节优先”。(根据)-否则,这将是一个很好的匹配。而且,更好的是,这是.Net标准!感谢您遇到这个老问题!
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);
}
private void GetBigEndianIntegerFromByteArray(ReadOnlySpan<byte> span,int offset)
{
    return BinaryPrimitives.ReadInt32BigEndian(span.Slice(offset));
}