0

我需要能够解析一个特殊的 NaN 字节数组来确定一个特定的条件。数组是 0x0000A07F。但是,当我通过 BitConverter 运行它并转换为浮点数然后再转换回字节数组时,转换不匹配。

private void testNan()
{
    Single tf;
    Byte[] to;
    Byte[] ti;

    // Normal NaN
    Debug.WriteLine("");
    Debug.Write("Normal  NaN: 0x");
    tf = Single.NaN;
    to = BitConverter.GetBytes(tf);
    foreach (var cb in to)
        Debug.Write(cb.ToString("X2"));

    // Special NaN
    Debug.WriteLine("");
    Debug.Write("Special NaN: 0x");
    ti = new byte[] { 0x00, 0x00, 0xA0, 0x7F }; // Special Array
    tf = BitConverter.ToSingle(ti, 0); // Float Conversion
    to = BitConverter.GetBytes(tf); // Byte Conversion
    foreach (var cb in to)
        Debug.Write(cb.ToString("X2"));

    // Iterate Conversion (3rd Byte)
    Debug.WriteLine("");
    Debug.WriteLine("Test Conversions");
    for (var count = 0; count < 256; count++)
    {
        ti = new byte[] { 0x00, 0x00, (byte) count, 0x7F };
        tf = BitConverter.ToSingle(ti, 0);
        to = BitConverter.GetBytes(tf);
        var pass = true;
        for (var subCount = 0; subCount < 4; subCount++)
            if (ti[subCount] != to[subCount]) pass = false;
        if (pass) continue;
        Debug.Write("FAIL [0x" + count.ToString("X2") + "]:  ");
        Debug.Write("IN=0x");
        foreach (var cb in ti)
            Debug.Write(cb.ToString("X2"));
        Debug.Write("  OUT=0x");
        foreach (var cb in to)
            Debug.Write(cb.ToString("X2"));
        Debug.WriteLine("");
    }
}

//Normal  NaN: 0x0000C0FF
//Special NaN: 0x0000E07F
//Test Conversions
//FAIL [0x81]:  IN=0x0000817F  OUT=0x0000C17F
//FAIL [0x82]:  IN=0x0000827F  OUT=0x0000C27F
//FAIL [0x83]:  IN=0x0000837F  OUT=0x0000C37F
//FAIL [0x84]:  IN=0x0000847F  OUT=0x0000C47F
//FAIL [0x85]:  IN=0x0000857F  OUT=0x0000C57F
//FAIL [0x86]:  IN=0x0000867F  OUT=0x0000C67F
//FAIL [0x87]:  IN=0x0000877F  OUT=0x0000C77F
//FAIL [0x88]:  IN=0x0000887F  OUT=0x0000C87F
//FAIL [0x89]:  IN=0x0000897F  OUT=0x0000C97F
//FAIL [0x8A]:  IN=0x00008A7F  OUT=0x0000CA7F
//FAIL [0x8B]:  IN=0x00008B7F  OUT=0x0000CB7F
//FAIL [0x8C]:  IN=0x00008C7F  OUT=0x0000CC7F
//FAIL [0x8D]:  IN=0x00008D7F  OUT=0x0000CD7F
//FAIL [0x8E]:  IN=0x00008E7F  OUT=0x0000CE7F
//FAIL [0x8F]:  IN=0x00008F7F  OUT=0x0000CF7F
//FAIL [0x90]:  IN=0x0000907F  OUT=0x0000D07F
//FAIL [0x91]:  IN=0x0000917F  OUT=0x0000D17F
//FAIL [0x92]:  IN=0x0000927F  OUT=0x0000D27F
//FAIL [0x93]:  IN=0x0000937F  OUT=0x0000D37F
//FAIL [0x94]:  IN=0x0000947F  OUT=0x0000D47F
//FAIL [0x95]:  IN=0x0000957F  OUT=0x0000D57F
//FAIL [0x96]:  IN=0x0000967F  OUT=0x0000D67F
//FAIL [0x97]:  IN=0x0000977F  OUT=0x0000D77F
//FAIL [0x98]:  IN=0x0000987F  OUT=0x0000D87F
//FAIL [0x99]:  IN=0x0000997F  OUT=0x0000D97F
//FAIL [0x9A]:  IN=0x00009A7F  OUT=0x0000DA7F
//FAIL [0x9B]:  IN=0x00009B7F  OUT=0x0000DB7F
//FAIL [0x9C]:  IN=0x00009C7F  OUT=0x0000DC7F
//FAIL [0x9D]:  IN=0x00009D7F  OUT=0x0000DD7F
//FAIL [0x9E]:  IN=0x00009E7F  OUT=0x0000DE7F
//FAIL [0x9F]:  IN=0x00009F7F  OUT=0x0000DF7F
//FAIL [0xA0]:  IN=0x0000A07F  OUT=0x0000E07F
//FAIL [0xA1]:  IN=0x0000A17F  OUT=0x0000E17F
//FAIL [0xA2]:  IN=0x0000A27F  OUT=0x0000E27F
//FAIL [0xA3]:  IN=0x0000A37F  OUT=0x0000E37F
//FAIL [0xA4]:  IN=0x0000A47F  OUT=0x0000E47F
//FAIL [0xA5]:  IN=0x0000A57F  OUT=0x0000E57F
//FAIL [0xA6]:  IN=0x0000A67F  OUT=0x0000E67F
//FAIL [0xA7]:  IN=0x0000A77F  OUT=0x0000E77F
//FAIL [0xA8]:  IN=0x0000A87F  OUT=0x0000E87F
//FAIL [0xA9]:  IN=0x0000A97F  OUT=0x0000E97F
//FAIL [0xAA]:  IN=0x0000AA7F  OUT=0x0000EA7F
//FAIL [0xAB]:  IN=0x0000AB7F  OUT=0x0000EB7F
//FAIL [0xAC]:  IN=0x0000AC7F  OUT=0x0000EC7F
//FAIL [0xAD]:  IN=0x0000AD7F  OUT=0x0000ED7F
//FAIL [0xAE]:  IN=0x0000AE7F  OUT=0x0000EE7F
//FAIL [0xAF]:  IN=0x0000AF7F  OUT=0x0000EF7F
//FAIL [0xB0]:  IN=0x0000B07F  OUT=0x0000F07F
//FAIL [0xB1]:  IN=0x0000B17F  OUT=0x0000F17F
//FAIL [0xB2]:  IN=0x0000B27F  OUT=0x0000F27F
//FAIL [0xB3]:  IN=0x0000B37F  OUT=0x0000F37F
//FAIL [0xB4]:  IN=0x0000B47F  OUT=0x0000F47F
//FAIL [0xB5]:  IN=0x0000B57F  OUT=0x0000F57F
//FAIL [0xB6]:  IN=0x0000B67F  OUT=0x0000F67F
//FAIL [0xB7]:  IN=0x0000B77F  OUT=0x0000F77F
//FAIL [0xB8]:  IN=0x0000B87F  OUT=0x0000F87F
//FAIL [0xB9]:  IN=0x0000B97F  OUT=0x0000F97F
//FAIL [0xBA]:  IN=0x0000BA7F  OUT=0x0000FA7F
//FAIL [0xBB]:  IN=0x0000BB7F  OUT=0x0000FB7F
//FAIL [0xBC]:  IN=0x0000BC7F  OUT=0x0000FC7F
//FAIL [0xBD]:  IN=0x0000BD7F  OUT=0x0000FD7F
//FAIL [0xBE]:  IN=0x0000BE7F  OUT=0x0000FE7F
//FAIL [0xBF]:  IN=0x0000BF7F  OUT=0x0000FF7F

我对转换进行了迭代,并得出了一系列不起作用的转换。基本上如果第 8 位和第 4 位设置在第三个字节中,则第 7 位总是在转换后设置。

换句话说 8* C* (80 不这样做,因为错误从 81 开始) 9* D* A* E* B* F*

4

0 回答 0