7

オブジェクトをバイト配列に変換するために、異なる値の型の配列をバイト配列に変換するソリューションを使用しています。

しかし、大きな問題を引き起こす小さな問題があります。

object[] の途中に「byte」型のデータがありますが、「byte」をそのままにしておく方法がわかりません。前後で同じバイト長を維持する必要があります。

次のように「バイト」タイプを辞書に追加しようとしました:

private static readonlyDictionary<Type, Func<object, byte[]>> Converters =
    new Dictionary<Type, Func<object, byte[]>>()
{
    { typeof(byte), o => BitConverter.GetBytes((byte) o) },
    { typeof(int), o => BitConverter.GetBytes((int) o) },
    { typeof(UInt16), o => BitConverter.GetBytes((UInt16) o) },
    ...
};
public static void ToBytes(object[] data, byte[] buffer)
{
    int offset = 0;

    foreach (object obj in data)
    {
        if (obj == null)
        {
            // Or do whatever you want
            throw new ArgumentException("Unable to convert null values");
        }
        Func<object, byte[]> converter;
        if (!Converters.TryGetValue(obj.GetType(), out converter))
        {
            throw new ArgumentException("No converter for " + obj.GetType());
        }

        byte[] obytes = converter(obj);
        Buffer.BlockCopy(obytes, 0, buffer, offset, obytes.Length);
        offset += obytes.Length;
    }
}

シンテキストに文句はありませんが、プログラムが実行された後、このコードをトレースしました

byte[] obytes = converter(obj);

元の「バイト」はバイト[2]になります。

そこで何が起こるの?このソリューションでバイト値を本物に保つ方法は?

ありがとう!

4

1 に答える 1

15

BitConverter.GetBytesを受け取るオーバーロードがないbyteため、コードは次のようになります。

BitConverter.GetBytes((byte) o)

BitConverter.GetBytes(short)最も近い一致( )に暗黙的に展開され、Int162 バイトになります。あなたがする必要があるのは、例えば次のように、単一要素のバイト配列を返すことだけです:

{ typeof(byte), o => new[] { (byte) o } }
于 2013-08-02T20:29:20.120 に答える