2016-09-07 5 views
0

У меня есть массив байтов result. Я хотел бы преобразовать свой тип с именем Info, которые все int в массив байтов, но все они имеют разный размер.Преобразование int в разные размеры массива байтов

а = 4 байта

б = 3 байта

с = 2 байта

д = 1 байт

Это код, я попробовал.

private byte[] getInfoByteArray(Info data) 
{ 
    byte[] result = new byte[10]; 
    BitConverter.GetBytes((data.a)).CopyTo(result, 0); 
    BitConverter.GetBytes((data.b)).CopyTo(result, 4); 
    BitConverter.GetBytes((data.c)).CopyTo(result, 7); 
    result [9] = Convert.ToByte(data.d); 

    return result; 
    } 

Однако, я узнал, что BitConverter.GetBytes возвращает 4 байта.

Существуют ли какие-либо общие решения, которые могут иметь разный размер байтов для байтового массива?

+0

'int' всегда хранится как 4 байта. 'GetBytes()' не всегда возвращает только массивы байтов длиной 4, это только потому, что вы используете тип данных 'int'. Вы можете использовать [этот ответ] (http://stackoverflow.com/a/11651620/74757) для вычисления минимального количества байтов, необходимых для хранения целых значений (предположительно возвращающих размеры 4, 3, 2 и 1, как указано), затем обрезать результат '.GetBytes()' до этой длины перед копированием в ваш последний массив байтов. –

+1

Непонятно, почему вам нужны разные длины байтов для ваших полей, особенно если все они являются фактически 'int'. Если вы уверены, что вам действительно нужны только 3, 2 или 1 байт для b, c и d, тогда c и d могут быть 'short' и' byte', что дает вам именно то, что вам нужно. Ваш результат для b зависит от endianness, но вы можете усечь массив, например. 'Array.Copy (BitConverter.GetBytes (data.b), 0, result, 4, 3)'. То есть если вам не нужны все байты, тогда ** не копируйте все байты **. –

ответ

1

Используйте Array.Copy(Array, Int32, Array, Int32, Int32) метод:

byte[] result = new byte[10]; 
Array.Copy(BitConverter.GetBytes(data.a), 0, result, 0, 4); 
Array.Copy(BitConverter.GetBytes(data.b), 0, result, 4, 3); 
Array.Copy(BitConverter.GetBytes(data.c), 0, result, 7, 2); 
Array.Copy(BitConverter.GetBytes(data.d), 0, result, 9, 1); 

Это предполагает небольшое аппаратное обеспечение Endian. Если ваше оборудование имеет большой размер, используйте

byte[] result = new byte[10]; 
Array.Copy(BitConverter.GetBytes(data.a), 0, result, 0, 4); 
Array.Copy(BitConverter.GetBytes(data.b), 1, result, 4, 3); 
Array.Copy(BitConverter.GetBytes(data.c), 2, result, 7, 2); 
Array.Copy(BitConverter.GetBytes(data.d), 3, result, 9, 1);