繁体   English   中英

Java - 将十六进制字符串转换为双精度

[英]Java - Converting Hex string to double

我试图解码 Java 中“众所周知的二进制”格式的值。 以下节点脚本可以满足我的需要

Buffer.from('A4C0A7DEBFC657C0', 'hex').readDoubleLE() // returns -95.1054608

我的问题是,等效的 Java 代码是多少? 我尝试过的任何东西都没有给出相同的结果。

参见: https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry

我将它作为 OpenSearch 中摄取管道的一部分运行,因此我不能使用 3rd 方库。

建议:看这里:

https://stackoverflow.com/a/8074533/421195

 import java.nio.ByteBuffer; public static byte[] toByteArray(double value) { byte[] bytes = new byte[8]; ByteBuffer.wrap(bytes).putDouble(value); return bytes; } public static double toDouble(byte[] bytes) { return ByteBuffer.wrap(bytes).getDouble(); }

要将十六进制字符串转换为字节数组,请尝试以下操作:

https://stackoverflow.com/a/140861/421195

Java 17现在包括 java.util.HexFormat(只用了 25 年):

HexFormat.of().parseHex(s)

对于旧版本的 Java :这是我认为比迄今为止发布的任何解决方案都更好的解决方案:

 /* s must be an even-length string. */ public static byte[] hexStringToByteArray(String s) { int len = s.length(); byte[] data = new byte[len / 2]; for (int i = 0; i < len; i += 2) { data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16)); } return data; }

这会做到的。 您提供的 FP64 号码是LITTLE_ENDIAN 字节序

public double convertFP64(String fp64) {
    return ByteBuffer
            .wrap(hexStringToByteArray(fp64))
            .order(ByteOrder.LITTLE_ENDIAN)
            .getDouble();
}
public byte[] hexStringToByteArray(String hex) {
    int l = hex.length();
    byte[] data = new byte[l / 2];
    for (int i = 0; i < l; i += 2) {
        data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
                + Character.digit(hex.charAt(i + 1), 16));
    }
    return data;
}

我找到了一个不需要ByteBuffer的解决方案,因为它不能无痛使用。

// convert hex string to byte array
int l = hex.length();    
byte[] data = new byte[l / 2];    
for (int i = 0; i < l; i+= 2) {        
  data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)              
    + Character.digit(hex.charAt(i + 1), 16));        
}

// convert byte array to double
long bits = 0L;
for (int i = 0; i < 8; i++) {
  bits |= (data[i] & 0xFFL) << (8 * i);
}
return Double.longBitsToDouble(bits); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM