java ieee_Java IEEE754 工具类

IEEE754转换类

package com.example.d23.utils;

import android.annotation.SuppressLint;

/**

* Author:Think

* Time:2021/2/3 16:58

* Description:This is IEEE754

*/

public class IEEE754 {

/**

* @Desc: IEEE754标准(四字节转浮点数),公式转换

* @Author: Aries.hu

* @Date: 2021/2/3 10:14

*/

public static float hex2FloatIeee(byte[] hex){

String hexStr = DataTransform.bytesToHex(hex);

StringBuilder binaryStr = new StringBuilder();

for(int i=0;i< hexStr.length();i+=2){

String a = hexStr.substring(i,i+2);

int c = Integer.parseInt(a,16);

@SuppressLint("DefaultLocale") String item = String.format("%08d",Integer.parseInt(Integer.toBinaryString(c)));

binaryStr.append(item);

}

int n = Integer.parseInt(binaryStr.substring(1,9),2);

String mStr = binaryStr.substring(9,binaryStr.length()-1);

double sum = 0;

for(int i =1;i<=mStr.length();i++){

if(mStr.charAt(i-1)=='1'){

sum = sum+Math.pow(0.5,i);

}

}

float v = (float) ((Math.pow(2, n - 127)) * (1 + sum));

return v;

}

/**

* @Desc: IEEE754标准(四字节转浮点数)调用JDK接口转换

* @Author: Aries.hu

* @Date: 2021/2/5 10:23

*/

public static float hex2floatIeeeApi(byte[] bytes, boolean reverse){

if(reverse){

bytes = DataTransform.bytesArrayReverse(bytes);

}

String hex= DataTransform.encodeHexStr(bytes, true);

return Float.intBitsToFloat(Integer.valueOf(hex, 16));

}

/**

* @Desc: IEEE754标准(浮点数转四字节)调用JDK接口转换

* @Author: Aries.hu

* @Date: 2021/2/5 11:57

*/

public static byte[] float2hexIeeeApi(float f){

int intBits = Float.floatToRawIntBits(f);

return DataTransform.intToByteArray(intBits);

}

}

数据转换类

package com.example.d23.utils;

/**

* Author:Think

* Time:2021/2/3 10:14

* Description:This is DataTransfor

*/

public class DataTransform {

//https://www.iteye.com/blog/aub-1129228

//https://github.com/FirebirdSQL/decimal-java

/**

* 用于建立十六进制字符的输出的小写字符数组

*/

private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5',

'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

/**

* 用于建立十六进制字符的输出的大写字符数组

*/

private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5',

'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

/**

* @Desc: 字节转十六进制字符串

* @Author: Aries.hu

* @Date: 2021/2/3 11:19

*/

public static String byteToHex(byte b) {

String hex = Integer.toHexString(b & 0xFF);

if (hex.length() < 2) {

hex = "0" + hex;

}

return hex;

}

/**

* @Desc: 字节数组转字符串

* @Author: Aries.hu

* @Date: 2021/2/3 11:19

*/

public static String bytesToHex(byte[] bytes) {

StringBuilder sbuffer = new StringBuilder();

for (byte aByte : bytes) {

String hex = Integer.toHexString(aByte & 0xFF);

if (hex.length() < 2) {

sbuffer.append(0);

}

sbuffer.append(hex);

}

return sbuffer.toString();

}

/**

* @Desc: 数组倒序

* @Author: Aries.hu

* @Date: 2021/2/3 15:15

*/

public static byte[] bytesArrayReverse(byte[] src){

byte temp = 0;

int len = src.length;

for (int i = 0; i < len / 2; i++) {

temp = src[i];

src[i] = src[len - i - 1];

src[len - i - 1] = temp;

}

return src;

}

/**

* @Desc: byte数组转换为二进制字符串,每个字节以","隔开

* @Author: Aries.hu

* @Date: 2021/2/3 15:47

*/

public static String byteArrToBinStr(byte[] b) {

StringBuffer result = new StringBuffer();

for (int i = 0; i < b.length; i++) {

result.append(Long.toString(b[i] & 0xff, 2) + ",");

}

return result.toString().substring(0, result.length() - 1);

}

/**

* @Desc: 二进制字符串转换为byte数组,8位一个字节

* @Author: Aries.hu

* @Date: 2021/2/3 15:48

*/

public static byte[] binStrToByteArr(String binStr) {

if("".equals(binStr)){

return new byte[0];

}

final int bits = 8;

int str_len = 0;

int byte_len = 0;

StringBuilder binStrBuilder = new StringBuilder(binStr);

while (binStrBuilder.length() < 32){

binStrBuilder.append("0");

}

binStr = binStrBuilder.toString();

str_len = binStr.length();

System.out.println(binStr);

if(str_len % bits == 0){

byte_len = str_len / bits;

}

byte[] b = new byte[byte_len];

int index = 0;

for(int i=0;i

String s = binStr.substring(i, i+bits);

System.out.println(s);

b[index] = bit2byte(s);

index++;

}

return b;

}

protected static String encodeHexStr(byte[] data, char[] toDigits) {

return new String(encodeHex(data, toDigits));

}

/**

* @Desc: 字节数组转十六进制字符串

* @Author: Aries.hu

* @Date: 2021/2/5 11:48

*/

public static String encodeHexStr(byte[] data, boolean toLowerCase) {

return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);

}

/**

* @Desc: 将字节数组转换为十六进制字符数组

* @Author: Aries.hu

* @Date: 2021/2/5 11:47

*/

protected static char[] encodeHex(byte[] data, char[] toDigits) {

int l = data.length;

char[] out = new char[l << 1];

// two characters form the hex value.

for (int i = 0, j = 0; i < l; i++) {

out[j++] = toDigits[(0xF0 & data[i]) >>> 4];

out[j++] = toDigits[0x0F & data[i]];

}

return out;

}

public static byte bit2byte(String bString){

byte result=0;

for(int i=bString.length()-1,j=0;i>=0;i--,j++){

result+=(Byte.parseByte(bString.charAt(i)+"")*Math.pow(2, j));

}

return result;

}

/**

* @Desc: 字节数组转二进制字符串

* @Author: Aries.hu

* @Date: 2021/2/3 10:24

*/

public static String bytes2BinaryStr(byte[] bytes){

StringBuilder binaryStr = new StringBuilder();

for (byte aByte : bytes) {

String str = Integer.toBinaryString((aByte & 0xFF) + 0x100).substring(1);

binaryStr.append(str);

}

return binaryStr.toString();

}

/**

* @Desc: int转byte数组

* @Author: Aries.hu

* @Date: 2021/2/5 21:21

*/

public static byte[] intToByteArray(int i) {

byte[] result = new byte[4];

// 由高位到低位

result[0] = (byte) ((i >> 24) & 0xFF);

result[1] = (byte) ((i >> 16) & 0xFF);

result[2] = (byte) ((i >> 8) & 0xFF);

result[3] = (byte) (i & 0xFF);

return result;

}

}

调用

package com.example.d23;

import com.example.d23.utils.DataTransform;

import com.example.d23.utils.IEEE754;

import org.junit.Test;

import static org.junit.Assert.assertEquals;

/**

* Author:Think

* Time:2021/2/3 11:21

* Description:This is DataTransforTest

*/

public class DataTransformTest {

@Test

public void bytesToFloat(){

byte[] bytes = {(byte) 0x7B, (byte) 0x20, (byte) 0xB1, (byte) 0x2C};

float result = IEEE754.hex2floatIeeeApi(bytes, true);

System.out.println(result);

}

@Test

public void floatToBytes(){

float f = 5.0342486E-12f;

byte[] result = IEEE754.float2hexIeeeApi(f);

System.out.println(DataTransform.bytesToHex(result));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值