С# преобразовать объект [] в байт [], но как сохранить байтовый объект как байт?

Я использую преобразование массива различных типов значений в байтовый массив для преобразования моих объектов в байтовый массив.

Но у меня есть небольшая проблема, которая вызывает большую проблему.

В середине объекта [] есть данные типа «байт», я не знаю, как сохранить «байт» как есть. Мне нужно сохранить одинаковую длину байтов до и после.

Я попытался добавить тип «байт» в словарь следующим образом:

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

Что здесь происходит? Как сохранить подлинность значения байта в этом решении?

Спасибо!


person Kai Mon    schedule 02.08.2013    source источник
comment
Не понятно, что здесь происходит. Можете ли вы показать код, который создает объект, а также код, который его распаковывает?   -  person cdhowie    schedule 03.08.2013
comment
Вы получаете массив, потому что GetBytes возвращает массив. Что именно вы пытаетесь сделать здесь, потому что это не ясно.   -  person Mike Perrenoud    schedule 03.08.2013
comment
Я обновил свой оригинальный пост. Я знаю, что GetBytes возвращает массив, но я хочу, чтобы он возвращал byte[1] для исходного значения байта.   -  person Kai Mon    schedule 03.08.2013


Ответы (1)


Не существует перегрузки BitConverter.GetBytes, которая принимает byte, поэтому ваш код:

BitConverter.GetBytes((byte) o)

Неявно расширяется до ближайшего совпадения: BitConverter.GetBytes(short) (Int16), в результате чего получается два байта. Все, что вам нужно сделать, это вернуть одноэлементный массив байтов, например. как это:

{ typeof(byte), o => new[] { (byte) o } }
person Tim S.    schedule 02.08.2013
comment
Спасибо вам всем. Оно работает. Я не понял эту лямбду. - person Kai Mon; 03.08.2013