Thứ Tư, 30 tháng 5, 2012

Chuyển đổi từ Microsoft Binary Format (single precision) thành IEEE 754 Single format

Here's the format of the two data types.



IEEE 754 Single format
======================
32 bits long (4 bytes)

sign (1 bit)| exponent (8 bits) | fraction (23 bits)

The exponent is biased by 127. 
There is an assumed 1 bit before the radix point 
 (so the assumed mantissa is 1.ffff... where f's are the fraction bits)


Microsoft Binary Format (single precision)
=======================           
32 bits long (4 bytes)

exponent (8 bits) | sign (1 bit) | fraction (23 bits)

The exponent is biased by 128. 
There is an assumed 1 bit after the radix point 
  (so the assumed mantissa is 0.1ffff... where f's are the fraction bits)


   public static float ConvertMbf4ToFloat(byte[] mbf) {
      if ((mbf == null) || (mbf.Length != 4))
        throw new ArgumentException("Invalid MBF array");

      if (mbf[3] == 0) return 0.0f;
      if (mbf[3] <= 2)
        throw new ArgumentException(
          "Underflow when converting from MBF to single");

      UInt32 temp = BitConverter.ToUInt32(mbf, 0);
      temp = (((temp - 0x02000000) & 0xFF000000) >> 1) |
        ((temp & 0x00800000) << 8) |
        (temp & 0x007FFFFF);
      byte[] single = BitConverter.GetBytes(temp);
      return BitConverter.ToSingle(single, 0);
    }
    public static byte[] ConvertFloatToMbf4(float s) {
      if (s == 0.0f) {
        return new byte[4];
      }

      if (Single.IsNaN(s))
        throw new ArgumentException(
          "Cannot convert a NaN to MBF format");
      if (Single.IsInfinity(s))
        throw new ArgumentException(
          "Cannot convert an infinity to MBF format");

      byte[] single = BitConverter.GetBytes(s);
      UInt32 temp = BitConverter.ToUInt32(single, 0);
      temp = (((temp & 0x7F800000) << 1) + 0x02000000) |
        ((temp & 0x80000000) >> 8) |
        (temp & 0x007FFFFF);

      return BitConverter.GetBytes(temp);
    }
  
static void Main(string[] args)
{
            byte[] byte_b = new byte[4];
            float float_a = 100.34f;
            float float_c;

            byte_b = ConvertFloatToMbf4(float_a);
            float_c = ConvertMbf4ToFloat(byte_b);

            Console.Write("Float: {0}", float_a);
            Console.WriteLine();
            Console.Write("Byte Array {0},{1},{2},{3}", byte_b[0], byte_b[1], byte_b[2], byte_b[3]);
            Console.WriteLine();
            Console.Write("Float is re-changed: {0}", float_c);
            Console.WriteLine();
 }

Không có nhận xét nào:

Đăng nhận xét