将 ushort[] 转换为 byte[] 并返回
Convert ushort[] into byte[] and back
我有一个 ushort 数组需要转换成字节数组才能通过网络传输。
一旦它到达目的地,我需要将它重新转换回原来的 ushort 数组。
短数组
是一个长度为 217,088 的数组(分解图像 512 x 424 的一维数组)。它存储为 16 位无符号整数。每个元素是 2 个字节。
字节数组
出于网络目的,需要将其转换为字节数组。由于每个 ushort 元素值 2 个字节,我假设字节数组长度需要为 217,088 * 2?
关于转换,然后 'unconverting' 正确,我不确定该怎么做。
这适用于 C# 中的 Unity3D 项目。有人能给我指出正确的方向吗?
谢谢。
您正在寻找 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
的 second 和 fourth 参数)你可以有 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;
}
我有一个 ushort 数组需要转换成字节数组才能通过网络传输。
一旦它到达目的地,我需要将它重新转换回原来的 ushort 数组。
短数组
是一个长度为 217,088 的数组(分解图像 512 x 424 的一维数组)。它存储为 16 位无符号整数。每个元素是 2 个字节。
字节数组
出于网络目的,需要将其转换为字节数组。由于每个 ushort 元素值 2 个字节,我假设字节数组长度需要为 217,088 * 2?
关于转换,然后 'unconverting' 正确,我不确定该怎么做。
这适用于 C# 中的 Unity3D 项目。有人能给我指出正确的方向吗?
谢谢。
您正在寻找 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
的 second 和 fourth 参数)你可以有 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;
}