2011-06-24 32 views
12

Tôi có một tệp nhị phân mà tôi đọc byte theo byte.Chuyển đổi 8 byte nhị phân nhỏ thành một phao chính xác kép

Tôi đi qua một phần dài 8 byte, giữ một phao chính xác kép (ít endian). Tôi không thể tìm ra cách để đọc điều này và tính toán nó đúng cách với mặt nạ và/hoặc đúc.

(Để cụ thể, loại tệp là .LAS, nhưng điều đó không quan trọng).

Có thủ thuật Java nào không?

Trả lời

19

Bạn có thể sử dụng ByteBuffer

từ một byte[] bytes

double d = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getDouble(); 

từ một Socket

ByteBuffer bb = ByteBuffer.allocate(64*1024).order(ByteOrder.LITTLE_ENDIAN); 
socket.read(bb); 
bb.flip(); 
double d = bb.getDouble(); 
+1

Đóng góp vô cùng vững chắc, chính xác những gì tôi cần. Cảm ơn bạn (và cho tất cả những người khác đã trả lời quá nhanh!) Chúc bạn một ngày cuối tuần vui vẻ. – RedLeader

+0

một bộ đệm trực tiếp sẽ tốt hơn ở đây (mẫu thứ 2), với điều kiện bộ đệm không được cấp phát thường xuyên và được tái sử dụng. Trong những trường hợp như vậy, tôi có xu hướng sử dụng socket readBuffer làm kích thước. – bestsss

+0

@bestsss, Đồng ý rằng một ByteBuffer trực tiếp sẽ tốt hơn nếu được quản lý chính xác. Tôi đã tìm thấy bộ đệm trực tiếp có thể nhanh hơn tới 20%. Nếu bạn sử dụng nó với lớp Unsafe, nó có thể nhanh hơn 30%. ;) –

0

Chỉ cần sử dụng DataInputStream để đọc tệp và sử dụng phương thức readDouble().

+1

DataInputStream luôn "mạng ra lệnh", mà là về cuối lớn. –

+0

"Một ứng dụng sử dụng luồng đầu ra dữ liệu để ghi dữ liệu mà sau này có thể được đọc bởi luồng đầu vào dữ liệu". Tôi không nghĩ rằng đó là trường hợp ở đây – peter

1
  1. Chuyển từ từ cuối nhỏ sang cuối lớn.
  2. Bẻ byte đã chuyển đổi của bạn thành ByteBufferInputStream sử dụng.
  3. Nhận số chính xác gấp đôi của bạn qua số DataInputStream.readDouble(in).

Ngoài ra, bạn có thể chỉ cần lấy phần thân của phương pháp readDouble từ nguồn JDK và bỏ qua bước 2 và 3.

Các vấn đề liên quan