0

.NET フレームワークが、要求された適切なエンディアンでバイト配列を明示的に返すだけの BitConverter クラスから関数/メソッドを提供するだけでよかったと思います。

私は他のコードでこのようないくつかの機能を実行しましたが、より短いより直接的な方法はありますか? (この概念は、PBKDF2、Skein、HMAC、BLAKE2、AES などを含むさまざまな暗号およびパスワード派生コンテキストで TON として使用されるため、効率が重要です)

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

また、他の人がこの質問に苦労していることもわかりましたが、まだ良い答えを見ていません:( 「エンディアン」に対処する方法

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)]

暗号化のパフォーマンスに関するもう 1 つのヒントは、配列をできるだけ避けることです。関数の先頭で配列からデータをロードし、ローカル変数を使用してすべてを実行し、最後に配列にコピーして戻します。

于 2013-09-14T16:33:33.873 に答える