为什么在将Vector3[]转换为Byte[]并使用BitConverter返回时会出现这种意外输出



如果我忽略了这里的快速修复方法,请原谅,但我已经阅读并研究了许多其他关于将float[]转换为byte[]并返回到float[]的答案,但仍然不明白为什么我会从下面的代码中得到意外的结果。我正在将float[]转换为byte[],以便作为blob存储在SQLite数据库中。然而,在将我的byte[]加载到数据库之前,我检查了一下,以确保我可以准确地将其转换回float[],但我得到的结果与我转换的float[]不匹配。我确实研究了endianness问题,并发现了这一点(下面有评论(,但结果虽然不同,但仍然出乎意料。如果能朝着正确的方向前进,我们将不胜感激——这对我来说是一个新的领域。谢谢!

由5个矢量3组成的测试数组应分别读取:(1,2,3(,而我得到:(0,1,2(、(0,0,0(、

//////////
// 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

最新更新