前言:
如今朋友们对“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