为什么在使用 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