Hash 有没有比BitConverter.IsLittleEndian更好的方法来检测.NET中的endianness?

Hash 有没有比BitConverter.IsLittleEndian更好的方法来检测.NET中的endianness?,hash,cryptography,bytearray,bitconverter,Hash,Cryptography,Bytearray,Bitconverter,如果.NET framework只提供BitConverter类中的函数/方法,这些函数/方法只显式返回一个具有正确请求的endianness的字节数组,那就太好了 我已经在其他代码中完成了一些类似的函数,但是有没有一种更短更直接的方法?(效率是关键,因为这个概念在各种密码和密码派生上下文中使用了很多,包括PBKDF2、Skein、HMAC、BLAKE2、AES和其他) 我还看到其他人在这个问题上苦苦挣扎,我还没有看到一个好的答案:(我在整数和字节[]之间转换的方式)是通过使用具有固定端号的位移

如果.NET framework只提供BitConverter类中的函数/方法,这些函数/方法只显式返回一个具有正确请求的endianness的字节数组,那就太好了

我已经在其他代码中完成了一些类似的函数,但是有没有一种更短更直接的方法?(效率是关键,因为这个概念在各种密码和密码派生上下文中使用了很多,包括PBKDF2、Skein、HMAC、BLAKE2、AES和其他)


我还看到其他人在这个问题上苦苦挣扎,我还没有看到一个好的答案:(

我在整数和
字节[]之间转换的方式)
是通过使用具有固定端号的位移位来实现的。使用这种代码,您不必担心主机端号。当您非常关心性能时,应该避免每次分配新数组

在我的加密库中,我使用:

public static UInt32 LoadLittleEndian32(byte[] buf, int offset)
{
    return
        (UInt32)(buf[offset + 0])
    | (((UInt32)(buf[offset + 1])) << 8)
    | (((UInt32)(buf[offset + 2])) << 16)
    | (((UInt32)(buf[offset + 3])) << 24);
}

public static void StoreLittleEndian32(byte[] buf, int offset, UInt32 value)
{
    buf[offset + 0] = (byte)value;
    buf[offset + 1] = (byte)(value >> 8);
    buf[offset + 2] = (byte)(value >> 16);
    buf[offset + 3] = (byte)(value >> 24);
}
如果您的目标是.net 4.5,则可以使用
[MethodImpl(MethodImplOptions.aggressiveinline)]
标记这些方法


加密的另一个性能提示是尽量避免使用数组。在函数开始时从数组加载数据,然后使用局部变量运行所有操作,最后才复制回数组。

在正确的PBKDF2实现中,只需在函数开始时在字节和整数之间进行转换对于典型的迭代计数来说,这是可以忽略的。只有糟糕的C#实现在每次迭代后才进行这些转换。
public static UInt32 LoadLittleEndian32(byte[] buf, int offset)
{
    return
        (UInt32)(buf[offset + 0])
    | (((UInt32)(buf[offset + 1])) << 8)
    | (((UInt32)(buf[offset + 2])) << 16)
    | (((UInt32)(buf[offset + 3])) << 24);
}

public static void StoreLittleEndian32(byte[] buf, int offset, UInt32 value)
{
    buf[offset + 0] = (byte)value;
    buf[offset + 1] = (byte)(value >> 8);
    buf[offset + 2] = (byte)(value >> 16);
    buf[offset + 3] = (byte)(value >> 24);
}
public static void StoreBigEndian32(byte[] buf, int offset, UInt32 value)
{
    buf[offset + 3] = (byte)value;
    buf[offset + 2] = (byte)(value >> 8);
    buf[offset + 1] = (byte)(value >> 16);
    buf[offset + 0] = (byte)(value >> 24);
}