提问人:gromiczek 提问时间:1/13/2022 更新时间:1/13/2022 访问量:97
为什么在使用 BitConverter 将 Vector3[] 转换为 Byte[] 并返回时会出现这种意外的输出?
Why this unexpected output when converting Vector3[] to Byte[] and back using BitConverter?
问:
请原谅,如果我忽略了这里的快速修复,但我已经阅读并研究了许多其他关于转换为和返回的答案,但仍然无法弄清楚为什么我从下面的代码中得到意想不到的结果。我正在将 to 转换为存储为 SQLite 数据库中的 blob。但是,在将我的加载到数据库之前,我进行了检查以确保我可以准确地将其转换回 ,但是我得到的结果与我转换的结果不匹配。我确实研究了字节序问题并为此做了一个发现(在下面进行了注释),但结果虽然不同,但仍然出乎意料。任何朝着正确方向的推动都将不胜感激——这对我来说是一个新领域。谢谢!float[]
byte[]
float[]
float[]
byte[]
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]);
}
}
答:
0赞
Sohaib Jundi
1/13/2022
#1
您的问题出在复制和转换中使用的索引上。
它应该代替复制和转换。(3 * j + 0)
j + 0
评论
0赞
gromiczek
1/13/2022
哦,我的天哪,你是对的。好渔获,谢谢!
评论