2010-02-06 33 views
16

Tôi đang chuyển một quy trình sang Java. Đã có các phiên bản làm việc trong C# và C++.Chuyển đổi dài [64] thành byte [512] thành Java?

Tôi có một phần trong C# mà tôi làm Marshal.Copy (...) để chuyển đổi 64 ulongs thành 512 byte và dòng trong C++ tôi sử dụng memmove (...) để làm điều tương tự. Những gì có sẵn trong Java để đạt được kết quả tương tự? Tôi cần cùng một thông tin nhị phân theo thứ tự giống như byte thay vì dài.

Chỉnh sửa:

Lý do tôi chuyển sang Java là tận dụng lợi thế của tính di động mà Java tự nhiên có. Tôi không muốn sử dụng mã gốc.

Một điều khác. Vì Java không chứa các giá trị chưa ký, sau đó tôi cần phải thay đổi những gì tôi yêu cầu chỉ một chút. Tôi muốn đạt được 8 giá trị byte unsigned từ mỗi trong số 64 longs (ulongs trong C# và C++) để tôi có thể sử dụng những giá trị tại các chỉ số trong mảng sau này. Điều này cần phải xảy ra hàng ngàn lần vì vậy cách nhanh nhất sẽ là cách tốt nhất.

Trả lời

20

ByteBuffer hoạt động tốt cho điều này: chỉ cần đặt trong giá trị 64 long và nhận được byte[] bằng phương pháp array(). Lớp ByteOrder có thể xử lý các vấn đề về cuối cùng một cách hiệu quả. Ví dụ, kết hợp với cách tiếp cận đề nghị trong một chú thích bởi wierob:

private static byte[] xform(long[] la, ByteOrder order) { 
    ByteBuffer bb = ByteBuffer.allocate(la.length * 8); 
    bb.order(order); 
    bb.asLongBuffer().put(la); 
    return bb.array(); 
} 

Phụ lục: Các kết quả byte[] thành phần được ký kết, giá trị 8-bit, nhưng mảng Java đòi hỏi nonnegative integer index values. Đúc một byte một int sẽ dẫn đến mở rộng dấu hiệu, nhưng mặt nạ các bit bậc cao sẽ cho giá trị unsigned của byte b:

int i = (int) b & 0xFF; 

answer này công phu trên các quy tắc điều hành được ưu tiên áp dụng. Điều này liên quan answer thể hiện một cách tiếp cận tương tự cho các giá trị double.

+1

+1 Bạn thậm chí không cần vòng lặp: bb.asLongBuffer() .đặt (la); – wierob

+1

Cảm ơn bạn! Đề xuất của bạn dễ đọc hơn và có khả năng hiệu quả hơn. http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#views – trashgod

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