将float []转换为string并返回float [] - 测试失败,但我不明白为什么

时间:2015-01-30 07:54:04

标签: c# .net

之前已经多次回答了一般方法,但是我的实现方法存在问题,但是我希望看到一个善良的读者能够找到我出错的地方。

代码和测试是;

 [TestMethod]
    public void FloatConversion()
    {
        // Set up some test data
        int repetitions = 100000;
        Random rand = new Random();
        float[] testSetOfFloats = new float[repetitions];
        for (int count = 0; count < repetitions; count++)
        {
            testSetOfFloats[count] = rand.NextFloat(0, float.MaxValue);
        }

        // Convert the floats into a byte array
        byte[] floatsAsByteArray = new byte[repetitions * 4]; // 4 bytes for a Single
        for (int count = 0; count < repetitions; count++)
        {
            byte[] floatAsBytes = BitConverter.GetBytes(testSetOfFloats[count]);
            floatAsBytes.CopyTo(floatsAsByteArray, count * 4);
        }
        // Convert the byte array to a Unicode string
        string serialisedByteArray = System.Text.Encoding.Unicode.GetString(floatsAsByteArray);

        // ... Do some work, store the string, re-read the string, then ...

        // Convert the unicode string back into a byte array
        byte[] deserializedByteArray = System.Text.Encoding.Unicode.GetBytes(serialisedByteArray);

        // Convert the byte array back into an array of floats
        float[] deserializedFloats = new float[repetitions];
        for (int count = 0; count < repetitions; count++)
        {
            int offset = count * 4;
            deserializedFloats[count] = BitConverter.ToSingle(deserializedByteArray, offset);
        }

        for (int count = 0; count < repetitions; count++)
        {
            // This will fail - but many will pass the test.
            Assert.IsTrue(deserializedFloats[count] == testSetOfFloats[count]);
        }
    }

唯一的非标准方法是Random NextFloat()的扩展,它只返回传递的值范围内的随机Single。

2 个答案:

答案 0 :(得分:5)

  

//将字节数组转换为Unicode字符串

    string serialisedByteArray = System.Text.Encoding.Unicode.GetString(floats);

您正在将浮点数转换为字节,然后将其转换为字符串...这是一个麻烦的处方。

有一些字节序列(查找代理对,高代理无效,如果没有低代理,反之亦然),它们不是有效的UCS-2字符串,因此可能无法“生存”从byte []到string并返回。

问题是:为什么要将二进制数据1:1转换为字符串?如果您需要将二进制文件作为字符串传输,则有许多编码可供选择,例如: BASE64。

答案 1 :(得分:1)

@DasKrümelmonster的回答是正确的。我想强调一点 - 你的考试不完整。

如果您添加了一个测试以确保第一个和第二个字节数组相同,那么所有这些都非常清楚。