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

Why this unexpected output when converting Vector3[] to Byte[] and back using BitConverter?

提问人:gromiczek 提问时间:1/13/2022 更新时间:1/13/2022 访问量:97

问:

请原谅,如果我忽略了这里的快速修复,但我已经阅读并研究了许多其他关于转换为和返回的答案,但仍然无法弄清楚为什么我从下面的代码中得到意想不到的结果。我正在将 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]);
        }
}
C# 数组浮 字节 位转换器

评论


答:

0赞 Sohaib Jundi 1/13/2022 #1

您的问题出在复制和转换中使用的索引上。 它应该代替复制和转换。(3 * j + 0)j + 0

评论

0赞 gromiczek 1/13/2022
哦,我的天哪,你是对的。好渔获,谢谢!