Конвертировать ushort[] в байт [] и обратно
У меня есть массив ushort, который необходимо преобразовать в байтовый массив для передачи по сети.
Как только он доберется до места назначения, мне нужно затем преобразовать его обратно в тот же массив ushort, с которым он был.
Ushort Array
Массив длины 217 088 (1D массив разбитого изображения 512 на 424). Он хранится как 16-битные целые числа без знака. Каждый элемент составляет 2 байта.
Байтовый массив
Он должен быть преобразован в байтовый массив для сетевых целей. Поскольку каждый элемент ushort стоит 2 байта, я предполагаю, что длина байтового массива должна быть 217 088 * 2?
С точки зрения конвертации, а затем "неконвертирования" правильно, я не уверен, как это сделать.
Это для проекта Unity3D, который находится в C#. Может ли кто-нибудь указать мне правильное направление?
Благодарю.
1 ответ
Ты ищешь BlockCopy
:
https://msdn.microsoft.com/en-us/library/system.buffer.blockcopy(v=vs.110).aspx
и да, short
так же как ushort
длиной 2 байта; и именно поэтому соответствующий byte
массив должен быть в два раза длиннее исходного short
один.
Непосредственный (byte
в short
):
byte[] source = new byte[] { 5, 6 };
short[] target = new short[source.Length / 2];
Buffer.BlockCopy(source, 0, target, 0, source.Length);
Задний ход:
short[] source = new short[] {7, 8};
byte[] target = new byte[source.Length * 2];
Buffer.BlockCopy(source, 0, target, 0, source.Length * 2);
с помощью offset
s (второй и четвертый параметры Buffer.BlockCopy
) у вас может быть разбитый массив 1D (как вы это выразили):
// it's unclear for me what is the "broken down 1d array", so
// let it be an array of array (say 512 lines, each of 424 items)
ushort[][] image = ...;
// data - sum up all the lengths (512 * 424) and * 2 (bytes)
byte[] data = new byte[image.Sum(line => line.Length) * 2];
int offset = 0;
for (int i = 0; i < image.Length; ++i) {
int count = image[i].Length * 2;
Buffer.BlockCopy(image[i], offset, data, offset, count);
offset += count;
}