0

如果 .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;
    }
}

我也看到其他人在这个问题上苦苦挣扎,我还没有看到一个好的答案:( 如何处理'Endianness'

4

1 回答 1

0

我在整数之间进行转换的方式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)]

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

于 2013-09-14T16:33:33.873 回答