【问题标题】:Is there a better way to detect endianness in .NET than BitConverter.IsLittleEndian?有没有比 BitConverter.IsLittleEndian 更好的方法来检测 .NET 中的字节顺序?
【发布时间】:2013-09-06 00:38:10
【问题描述】:

如果 .NET 框架仅提供来自 BitConverter 类的函数/方法,该类仅以正确请求的字节序显式返回字节数组,那就太好了。

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

// convert an unsigned int into an array of bytes BIG ENDIEN
// per the spec section 5.2 step 3 for PBKDF2 RFC2898
static internal byte[] IntToBytes(uint i)
{
    byte[] bytes = BitConverter.GetBytes(i);
    if (!BitConverter.IsLittleEndian)
    {
        return bytes;
    }
    else
    {
        Array.Reverse(bytes);
        return bytes;
    }
}

我也看到其他人在这个问题上苦苦挣扎,我还没有看到一个好的答案:(How to deal with 'Endianness'

【问题讨论】:

  • 在正确的 PBKDF2 实现中,您只需要在开始和结束时在字节和整数之间进行转换。这对于典型的迭代计数可以忽略不计。只有糟糕的 C# 实现会在每次迭代后进行这些转换。

标签: hash cryptography bytearray bitconverter


【解决方案1】:

我在整数和byte[] 之间进行转换的方法是使用具有固定字节序的移位。您无需担心此类代码的主机字节序。当您如此关心性能时,您应该避免每次都分配一个新数组。

在我的加密库中我使用:

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);
}

如果您的目标是 .net 4.5,使用 [MethodImpl(MethodImplOptions.AggressiveInlining)] 标记这些方法会很有用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多