为什么在使用 BitConverter 将 Vector3[] 转换为 Byte[] 并返回时出现意外输出?
Why this unexpected output when converting Vector3[] to Byte[] and back using BitConverter?
请原谅我忽略了这里的快速修复,但我已经阅读并完成了很多其他关于将 float[]
转换为 byte[]
并返回到 [=11= 的答案],但仍然无法弄清楚为什么我从下面的代码中得到了意想不到的结果。我正在将 float[]
转换为 byte[]
以便在 SQLite 数据库中存储为 blob。然而,在将我的 byte[]
加载到数据库之前,我检查以确保我可以将它准确地转换回 float[]
,但是我得到的结果与我转换的 float[]
不匹配.我确实调查了字节顺序问题并对此做了一个捕获(它在下面被注释掉),但结果虽然不同,但仍然出乎意料。任何朝着正确方向的推动都会受到赞赏 - 这对我来说是新领域。谢谢!
5 个 vector3 的测试数组应该分别读取:(1,2,3) 而我得到:(0,1,2), (0,0,0), (0, 0,0), (0,0,2), (1,2,3)
//////////
// input
var numPositions = 5;
var particlePositionsArrayForEachSegment = new Vector3[numPositions];
for (int i = 0; i < particlePositionsArrayForEachSegment.Length; i++)
{
Vector3 vector = new Vector3(1f, 2f, 3f);
particlePositionsArrayForEachSegment[i] = vector;
}
byte[] buff = new byte[particlePositionsArrayForEachSegment.Length * (sizeof(float) * 3)];
for (int j = 0; j < particlePositionsArrayForEachSegment.Length; j++)
{
/*if (BitConverter.IsLittleEndian)
{
// x
byte[] xBytes = BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].x);
Array.Reverse(xBytes);
Buffer.BlockCopy(xBytes, 0, buff, j + 0 * sizeof(float), sizeof(float));
// y
byte[] yBytes = BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].y);
Array.Reverse(yBytes);
Buffer.BlockCopy(yBytes, 0, buff, j + 1 * sizeof(float), sizeof(float));
// z
byte[] zBytes = BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].z);
Array.Reverse(zBytes);
Buffer.BlockCopy(zBytes, 0, buff, j + 2 * sizeof(float), sizeof(float));
}
else
{*/
Buffer.BlockCopy(BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].x),
0, buff, j + 0 * sizeof(float), sizeof(float));
Buffer.BlockCopy(BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].y),
0, buff, j + 1 * sizeof(float), sizeof(float));
Buffer.BlockCopy(BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].z),
0, buff, j + 2 * sizeof(float), sizeof(float));
//}
}
//////////
// output
var outputParticlePositionsArrayForEachSegment = new Vector3[numPositions];
byte[] buff1 = buff;
for (int k = 0; k < outputParticlePositionsArrayForEachSegment.Length; k++)
{
Vector3 vect = Vector3.zero;
vect.x = BitConverter.ToSingle(buff1, k + 0 * sizeof(float));
vect.y = BitConverter.ToSingle(buff1, k + 1 * sizeof(float));
vect.z = BitConverter.ToSingle(buff1, k + 2 * sizeof(float));
outputParticlePositionsArrayForEachSegment[k] = vect;
}
var alleleArray = outputParticlePositionsArrayForEachSegment;
if (alleleArray != null)
for (var l = 0; l < alleleArray.Length; l++)
{
Debug.Log(alleleArray[l]);
}
}
您的问题与复制和转换中使用的索引有关。
复制和转换都应该是 (3 * j + 0)
而不是 j + 0
。
请原谅我忽略了这里的快速修复,但我已经阅读并完成了很多其他关于将 float[]
转换为 byte[]
并返回到 [=11= 的答案],但仍然无法弄清楚为什么我从下面的代码中得到了意想不到的结果。我正在将 float[]
转换为 byte[]
以便在 SQLite 数据库中存储为 blob。然而,在将我的 byte[]
加载到数据库之前,我检查以确保我可以将它准确地转换回 float[]
,但是我得到的结果与我转换的 float[]
不匹配.我确实调查了字节顺序问题并对此做了一个捕获(它在下面被注释掉),但结果虽然不同,但仍然出乎意料。任何朝着正确方向的推动都会受到赞赏 - 这对我来说是新领域。谢谢!
5 个 vector3 的测试数组应该分别读取:(1,2,3) 而我得到:(0,1,2), (0,0,0), (0, 0,0), (0,0,2), (1,2,3)
//////////
// input
var numPositions = 5;
var particlePositionsArrayForEachSegment = new Vector3[numPositions];
for (int i = 0; i < particlePositionsArrayForEachSegment.Length; i++)
{
Vector3 vector = new Vector3(1f, 2f, 3f);
particlePositionsArrayForEachSegment[i] = vector;
}
byte[] buff = new byte[particlePositionsArrayForEachSegment.Length * (sizeof(float) * 3)];
for (int j = 0; j < particlePositionsArrayForEachSegment.Length; j++)
{
/*if (BitConverter.IsLittleEndian)
{
// x
byte[] xBytes = BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].x);
Array.Reverse(xBytes);
Buffer.BlockCopy(xBytes, 0, buff, j + 0 * sizeof(float), sizeof(float));
// y
byte[] yBytes = BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].y);
Array.Reverse(yBytes);
Buffer.BlockCopy(yBytes, 0, buff, j + 1 * sizeof(float), sizeof(float));
// z
byte[] zBytes = BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].z);
Array.Reverse(zBytes);
Buffer.BlockCopy(zBytes, 0, buff, j + 2 * sizeof(float), sizeof(float));
}
else
{*/
Buffer.BlockCopy(BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].x),
0, buff, j + 0 * sizeof(float), sizeof(float));
Buffer.BlockCopy(BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].y),
0, buff, j + 1 * sizeof(float), sizeof(float));
Buffer.BlockCopy(BitConverter.GetBytes(particlePositionsArrayForEachSegment[j].z),
0, buff, j + 2 * sizeof(float), sizeof(float));
//}
}
//////////
// output
var outputParticlePositionsArrayForEachSegment = new Vector3[numPositions];
byte[] buff1 = buff;
for (int k = 0; k < outputParticlePositionsArrayForEachSegment.Length; k++)
{
Vector3 vect = Vector3.zero;
vect.x = BitConverter.ToSingle(buff1, k + 0 * sizeof(float));
vect.y = BitConverter.ToSingle(buff1, k + 1 * sizeof(float));
vect.z = BitConverter.ToSingle(buff1, k + 2 * sizeof(float));
outputParticlePositionsArrayForEachSegment[k] = vect;
}
var alleleArray = outputParticlePositionsArrayForEachSegment;
if (alleleArray != null)
for (var l = 0; l < alleleArray.Length; l++)
{
Debug.Log(alleleArray[l]);
}
}
您的问题与复制和转换中使用的索引有关。
复制和转换都应该是 (3 * j + 0)
而不是 j + 0
。