- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 3 种方法(1 种功能性(double to byte[]),一种返回意外值(byte[] to double),还有 1 种功能性但执行许多操作以使用 Hex to double 的方法))。
性能是最重要的,所以如果你有更高效的代码,请分享。
函数方法从 double 转换为 byte[] getFloat64(11.27d) 返回 byte[]=hex string "40268A3D70A3D70A"
:
public static byte[] getFloat64(double value)
{
final byte[] float64Bytes = new byte[8];
long double64Long=Double.doubleToLongBits(value);
float64Bytes[0] = (byte)((double64Long >> 56) & 0xff);
float64Bytes[1] = (byte)((double64Long >> 48) & 0xff);
float64Bytes[2] = (byte)((double64Long >> 40) & 0xff);
float64Bytes[3] = (byte)((double64Long >> 32) & 0xff);
float64Bytes[4] = (byte)((double64Long >> 24) & 0xff);
float64Bytes[5] = (byte)((double64Long >> 16) & 0xff);
float64Bytes[6] = (byte)((double64Long >> 8) & 0xff);
float64Bytes[7] = (byte)((double64Long >> 0) & 0xff);
return float64Bytes;
}
从这个 byte[] 到 double 方法返回不正确的 double 值(调用 getFloat64(getFloat64(11.27d)) 返回 9.338087023E-315):
public static double getFloat64(byte[] bytes)
{
return Double.longBitsToDouble((long)((bytes[0] & 0xFF) << 56)
| ((bytes[1] & 0xFF) << 48)
| ((bytes[2] & 0xFF) << 40)
| ((bytes[3] & 0xFF) << 32)
| ((bytes[4] & 0xFF) << 24)
| ((bytes[5] & 0xFF) << 16)
| ((bytes[6] & 0xFF) << 8)
| ((bytes[7] & 0xFF) << 0));
}
final方法返回正确答案调用 getFloat64("40268A3D70A3D70A") 返回 11.27:
public double getFloat64(String hex_double)
{
long longBits = Long.valueOf(hex_double,16).longValue();
return Double.longBitsToDouble(longBits);
}
中间方法有什么问题?为什么返回 11.27 不像上一个方法那样?
最佳答案
问题是 (bytes[0] & 0xFF)
仍然是一个 32 位整数值。如果将 32 位值向左移动 56 位,Java 将移动 56 % 32 = 24
位而不是 56 位。
您首先需要将该值提升为 64 位长,然后再对其进行位移。一种方法是使用长值 (0xFFL
) &
。任何整型数字文字(通常具有 int
类型,因此是 32 位)可以通过附加 L
或 l
到它。
更正后的代码:
public static double getFloat64(byte[] bytes)
{
return Double.longBitsToDouble(((bytes[0] & 0xFFL) << 56)
| ((bytes[1] & 0xFFL) << 48)
| ((bytes[2] & 0xFFL) << 40)
| ((bytes[3] & 0xFFL) << 32)
| ((bytes[4] & 0xFFL) << 24)
| ((bytes[5] & 0xFFL) << 16)
| ((bytes[6] & 0xFFL) << 8)
| ((bytes[7] & 0xFFL) << 0));
}
ob-JLS 引用:Java Language Specification 15.9 :
If the promoted type of the left-hand operand is
int
, only the five lowest-order bits of the right-hand operand are used as the shift distance. It is as if the right-hand operand were subjected to a bitwise logical AND operator&
(§15.22.1) with the mask value0x1f
(0b11111). The shift distance actually used is therefore always in the range 0 to 31, inclusive.
关于java - 如何将 Java double 转换为 byte[],byte[] 转换为 double(IEEE 754 double 二进制浮点格式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28121966/
我有以下代码: foreach (byte b in bytes) { byte inv = byte.MaxValue - b; // Add the new value to a
我需要从这个文本文件source.txt中读取内容并将内容反向写入这个文本文件destination.txt。读取和写入必须使用逐字节完成! 我使用 BufferedReader 和 Buffered
我需要存储大量 RGB 颜色对象。对于某些常见用途,这些占用了我的应用程序总内存的 8% 到 12%。我目前将其定义如下: class MyColor { byte red; byte green;
我有一个由字节数组表示的整数。 byte[] result = getResult(); resultInt1 = Integer.parseInt(Bytes.toString(result));/
我正在尝试使用 Rusoto 库调用 AWS Lambda 函数。该请求有一个 JSON 编码的有效负载,我目前将其作为一个字符串,但该库为此坚持使用 bytes::bytes::Bytes 结构。我
我正在尝试基于 Tokio's example 编写一个 TCP 服务器. 当我尝试发送缓冲区时,编译器返回错误 0277。 我的代码:(playground) extern crate tokio;
我知道我可以通过 IList 进行枚举,例如: public byte[] ConvertToByteArray(IList> list) { IList newList = new List
考虑这样一个文本文件: Some text here. --- More text another line. --- Third part of text. 我想把它分成三部分,用---分隔符分开。
如果我有一个字节变量:byte b = 0; 为什么以下工作: b++; b += 1; // compiles ...但这不是吗? b = b + 1; // compile er
我有一个简单的字节数组,我想从中获取颜色。我的计划是用红色表示三位,绿色表示三位,蓝色表示两位。 8 位。 我认为颜色是正确的: 如有错误请指正 byte[] colours = new byte[
我的目标是比较两个字节数组中的两个字符串值。它实际上需要创建两个新的字符串对象才能使用 contains 方法。是选择正确还是有什么办法可以使用优化方式而不使用新的关键字。 if(new String
我正在使用github.com/tarm/serial来连接一些串行仪器。在开发过程中,我使用/dev/ttyp0和/dev/ptyp0对,其中go进程连接到一个,我使用screen连接到另一个。我编
好的,所以如果一个字节是 8 位,那么半字节就是 4 位。并且您可以将四分之一字节作为 2 位(尽管我想,如果有的话,它会被称为双位)。 虽然这是一致的,但如果我使用这个词,有人会感到困惑(或惊讶)吗
我在解释文件时遇到问题。文件构建如下: "name"-@-"date"-@-"author"-@-"signature" 签名是一个字节数组。当我读回文件时,我将其解析为 String 并拆分它: m
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
Java 让我很难过,因为它需要 ArrayList 的包装类秒。我将如何添加 byte[]到 ArrayList ? 最佳答案 LOL 认为我必须包装所有东西。 ArrayList作品。谢谢一晒。
我有一个 16 字节的 md5 散列,我需要使用 XOR 将其“折叠”成 4 字节数据:{1st 4 bytes} XOR {2nd 4 bytes} XOR {3rd 4 bytes} XOR {4
我正在学习SMSC smc91cx驱动代码,我学习了如何根据Application Note 9-6的说明编写smc91c111网卡的测试代码。 .我无法理解“传输数据包”下的以下说明: Write
我必须附加(可变数量的)字节数组。集合似乎只适用于包装类,即 Byte。大约 20 小时后,我想到了这个,并且它有效,但我想知道它是否可以改进(添加到列表,但欢迎任何其他改进建议:),即 Collec
我有两个基本相同的操作: insert_bytes(from, count) delete_bytes(start, stop) -> delete_bytes(from, count) insert
我是一名优秀的程序员,十分优秀!