Java 将字节数组转换为双字节数组
为什么我要从以下函数中获取垃圾 传入的Java 将字节数组转换为双字节数组,java,type-conversion,Java,Type Conversion,为什么我要从以下函数中获取垃圾 传入的\u数据参数是字节[]={6D,F3,B4,15} \u endian参数是字节顺序.字节顺序.LITTLE\u endian ByteBuffer m_ByteBuffer; public static double ByteToDouble(byte[] _data, int offset, ByteOrder _endian){ synchronized (m_ByteBuffer) { m_ByteBuf
\u数据
参数是字节[]={6D,F3,B4,15}
\u endian
参数是字节顺序.字节顺序.LITTLE\u endian
ByteBuffer m_ByteBuffer;
public static double ByteToDouble(byte[] _data, int offset, ByteOrder _endian){
synchronized (m_ByteBuffer) {
m_ByteBuffer.clear();
m_ByteBuffer.order(_endian);
m_ByteBuffer.position(0);
m_ByteBuffer.get(_data);
m_ByteBuffer.position(0);
}
return m_ByteBuffer.getDouble();
}
我举了一个小例子,看看如何来回转换 希望能有帮助
import java.io.ByteArrayOutputStream;
导入java.io.DataOutputStream;
导入java.io.IOException;
导入java.nio.ByteBuffer;
导入java.nio.ByteOrder;
公共类ByteToDuble{
公共静态void main(字符串[]args)引发IOException{
双d1=123.456;
double d2=bytestoduble(doubleToBytes(d1));
System.out.printf(“d1:%f\nd2:%f\n”,d1,d2);
}
公共静态字节[]双字节(双d)引发IOException{
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
DataOutputStream dos=新的DataOutputStream(bos);
可写双工(d);
dos.flush();
返回bos.toByteArray();
}
公共静态double ByTestDouble(字节[]字节){
ByteBuffer buffer=ByteBuffer.wrap(字节).order(字节顺序.BIG_-ENDIAN);
返回buffer.getDouble();
}
}
请注意,如果缓冲区中剩余的字节少于8个,则ByteBuffer#getDouble()
方法将抛出BufferUnderflowException
。(参见JavaDoc)在您使用的代码中
m_ByteBuffer.get(_data);
它会将缓冲区的数据读入\u data
。我想你想用的是
此外,在将数据放入缓冲区后,更常见的做法是使用位置(0)
,因为这样可以正确设置缓冲区的限制。总而言之,这将大致导致:
m_ByteBuffer.order(_endian);
m_ByteBuffer.clear();
m_ByteBuffer.put(_data);
m_ByteBuffer.flip();
m_ByteBuffer.getDouble();
4个字节表示浮点,8个字节表示双字节
byte[] data = {0x6D, 0xF3, 0xB4, 0x15};
double x = bytesToDouble(data);
public static double bytesToDouble(byte[] data) {
ByteBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
return data.length == 4 ? bb.getFloat() : bb.getDouble();
}
ByteBuffer.wrap(byte[])
是数组的轻量级包装,具有对字节的写入功能。全局ByteBuffer不一定更快,在需要同步时肯定不会更快。欢迎访问stackoverflow.com。请注意,这是一个讲英语的网站,这里很少有人能理解什么看起来像韩语。我投票将这个问题作为离题题来结束,因为它不是用英语写的。没有什么好的理由把你的注释行留在那里,混淆和混乱代码。您的工作是帮助我们帮助您,使您的问题集中、清晰、清晰,让我们尽可能容易地找出问题所在,而不必猜测您是在那里留下代码向我们解释什么,还是仅仅因为懒惰。谢谢!!我试着跑flip()。但是,发生了一个错误,程序终止。错误:E/AndroidRuntime:致命异常:java.nio。BufferUnderflowException@RAYZIE澄清一下:BufferUnderflowException在调用getDouble时抛出(根据文档,flip不能抛出)?请记住,double
表示8个字节。您可能想使用getFloat
。
byte[] data = {0x6D, 0xF3, 0xB4, 0x15};
double x = bytesToDouble(data);
public static double bytesToDouble(byte[] data) {
ByteBuffer bb = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
return data.length == 4 ? bb.getFloat() : bb.getDouble();
}