龙空技术网

C#实现Byte数组转换为Float或者Double类型数据

NCG杰哥 392

前言:

如今朋友们对“java byte数组转double”大致比较关心,小伙伴们都需要知道一些“java byte数组转double”的相关资讯。那么小编在网上网罗了一些关于“java byte数组转double””的相关资讯,希望同学们能喜欢,各位老铁们快快来了解一下吧!

有一些数据文件会把Floa或者Doublet型数据进行保存,如果要读取这类文件,就需要将二进制文件转化为Float或者Double数据,即Byte数组转换为Float或者Double数据。

Float类型,

空间占据4个字节。Float类型主要包含3个部分(符号部分,指数部分,小数部分)。其中符号部分表示的是数据的正负,即最高位;指数部分表示的是2的幂次;尾数部分是Float类型的乘数。

以数据为例,如果该Float类型的数据存储从高位到低位为:0x34,0x83,0x12,0x6F。那么需要将数据分解为下面的格式:(其中黑色部分代表1,白色部分代表0)

如上图所示,最高位31bit为数据正负,0代表正数,1代表负数。23~30 bit为指数部分,8个bit,数据范围为-127~128。0~22 bit为小数部分,22bit代表0.5,21bit代表0.25,20bit代表0.125,19bit代表0.625,18bit代表0.3125等等。

上边数据为例,(0x34,0x83,0x12,0x6F),其中最高位31bit为0,数据为正;指数部分(23~30bit)为01101001,数值为(105-127=-22)-22;小数部分(0~22bit)为0000 0110 0010 0100 1101 111,数值为:0.015625+0.0078125+.....

那么Float型的最终数据为

其中F表示的是小数部分,数据量比较大,我这边就不进行具体计算了。

Double类型

空间占据8个字节,Double类型的数据部分与Float类型是一致的,也是分为三个部分(符号部分,指数部分,小数部分)。

以数据为例,数据从高位到低位分别为(0xFE,0xDC,0xBA,0x98, 0x76,0x54,0x32,0x10)

仍然是最高位为数据的正负,53~62bit(共11个bit)为2的幂次,范围为-1023~1024,0~52bit为小数部分,52bit-->0.5, 51bit-->0.25, 49bit-->0.125, 48bit-->0.0625以此类推。

最后我们用C#来快速实现数据类型的转换。

C#实现

简单的做了一个Byte数组转化为Float以及Double的程序。C#有专门的方法来处理这一转换,调用代码如下:(其中DataResults是结果显示,software_status.format_byte是存储数据的Byte,Byte0是低位数据)

DataResults.Text = BitConverter.ToSingle(software_status.format_byte, 0).ToString("F15");DataResults.Text = BitConverter.ToDouble(software_status.format_byte, 0).ToString("F15");

上面的源码为:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace Cellwise_Debug_Tool{    public partial class SoftwareToolWindows : Form    {        public struct software_status_t        {            public byte[] format_byte;            public byte format_convert_type;//0x00:Float,0x01:Double        }        public enum format_convert_type_t        {            Format_To_Float=0x00,            Format_To_Double=0x01,        }        software_status_t software_status;        MainTool main_windows;        public SoftwareToolWindows(MainTool this_main)        {            InitializeComponent();            app_init();            main_windows = this_main;        }        private void app_init()        {            software_status.format_byte = new byte[8];            ToFormatType.SelectedIndex = 0;        }        private void SoftwareToolWindows_FormClosing(object sender, FormClosingEventArgs e)        {            main_windows.main_status.son_windows_show_flag = false;            main_windows.Show();        }        private void Convert_Click(object sender, EventArgs e)        {            try            {                switch (software_status.format_convert_type)                {                    case (byte)(format_convert_type_t.Format_To_Float):                        software_status.format_byte[0] = Byte.Parse(Byte0Value.Text, System.Globalization.NumberStyles.HexNumber);                        software_status.format_byte[1] = Byte.Parse(Byte1Value.Text, System.Globalization.NumberStyles.HexNumber);                        software_status.format_byte[2] = Byte.Parse(Byte2Value.Text, System.Globalization.NumberStyles.HexNumber);                        software_status.format_byte[3] = Byte.Parse(Byte3Value.Text, System.Globalization.NumberStyles.HexNumber);                        DataResults.Text = BitConverter.ToSingle(software_status.format_byte, 0).ToString("F15");                        break;                    case (byte)format_convert_type_t.Format_To_Double:                        software_status.format_byte[0] = Byte.Parse(Byte0Value.Text, System.Globalization.NumberStyles.HexNumber);                        software_status.format_byte[1] = Byte.Parse(Byte1Value.Text, System.Globalization.NumberStyles.HexNumber);                        software_status.format_byte[2] = Byte.Parse(Byte2Value.Text, System.Globalization.NumberStyles.HexNumber);                        software_status.format_byte[3] = Byte.Parse(Byte3Value.Text, System.Globalization.NumberStyles.HexNumber);                        software_status.format_byte[4] = Byte.Parse(Byte4Value.Text, System.Globalization.NumberStyles.HexNumber);                        software_status.format_byte[5] = Byte.Parse(Byte5Value.Text, System.Globalization.NumberStyles.HexNumber);                        software_status.format_byte[6] = Byte.Parse(Byte6Value.Text, System.Globalization.NumberStyles.HexNumber);                        software_status.format_byte[7] = Byte.Parse(Byte7Value.Text, System.Globalization.NumberStyles.HexNumber);                        DataResults.Text = BitConverter.ToDouble(software_status.format_byte, 0).ToString("F15");                        break;                    default:                        break;                }            }            catch            {                MessageBox.Show("Format Error!");            }        }        private void ToFormatType_SelectedIndexChanged(object sender, EventArgs e)        {            software_status.format_convert_type = (byte)ToFormatType.SelectedIndex;            if (software_status.format_convert_type == 0x00)            {                Byte4Value.Enabled = false;                Byte5Value.Enabled = false;                Byte6Value.Enabled = false;                Byte7Value.Enabled = false;            }            else            {                Byte4Value.Enabled = true;                Byte5Value.Enabled = true;                Byte6Value.Enabled = true;                Byte7Value.Enabled = true;            }        }    }}

标签: #java byte数组转double #java byte数组转二进制 #编写程序在堆内存中申请一个float型数组 #javabyte转float