2012-03-20 20 views
5

Đến từ thế giới của C# và đánh thức trên Java, tôi đã học được rằng không có byte/int chưa ký. Tôi cố gắng để tìm hiểu là những gì cách dễ nhất xây dựng các thông điệp tùy chỉnh nhị phân như ví dụ sau:Cách dễ nhất để đặt thông điệp dữ liệu nhị phân tùy chỉnh trong Java là gì?

enter image description here

Như bạn có thể thấy, giá trị số nguyên nhất định cần phải đưa vào một khe cắm 3 bit. các giá trị khác là các cờ bit đơn hoặc các trường kích thước khác. Từ những gì tôi đã đọc, tôi nên làm việc trong nguyên thủy "lớn hơn tiếp theo", chẳng hạn như xây dựng các byte nhị phân trong các số nguyên sử dụng các toán tử khôn ngoan. Có cách nào khác không? Tôi đã làm theo một số ví dụ tôi đã tìm thấy ở những nơi khác như (Lưu ý: ví dụ này không khớp với hình trên) để có được byte đầu tiên được cấu trúc:

shiftedValue1 = (value1 & 0xFF) << 5; 
shiftedValue2 = (Value2 & 0xFF) << 2; 
shiftedValue3 = (Value3 & 0xFF) << 1; 
shiftedValue4 = (Value4 & 0xFF); 
finalvalue = (shiftedValue1 & 0xFF) | (shiftedValue2 & 0xFF) | (shiftedValue3 & 0xFF) | (shiftedValue4 & 0xFF); 

Có cách nào tốt hơn để tạo các byte này không? Tôi phải làm gì trên 4 trường Byte? Longs?

+0

Có lẽ tôi đang thất bại, nhưng - bất chấp truyền thống xem các trường như giá trị chưa ký, có bất kỳ vấn đề thực tế nào khi xử lý chúng dưới dạng giá trị đã ký không? Nếu, trong C#, bạn sẽ xem một trường một byte nhất định từ 0 ('00') đến 255 (' FF'), có bất kỳ tác hại nào trong phạm vi từ 0 đến 127 ('00' đến' 7F') và -128 đến -1 ('80' đến' FF')? Nơi tôi làm việc, một số đối tác/khách hàng của chúng tôi làm chính xác điều này; một giá trị xuất hiện trong C enum là '0x85' sẽ xuất hiện trong một thuộc tính XML là' "-123" '. Nghe có vẻ hơi lạ, nhưng nó không bao giờ gây ra bất kỳ vấn đề gì. – ruakh

+0

Tôi thực sự có thể thử đi theo hướng đó ... – kuhnto

Trả lời

1

Có vẻ như điều này sẽ dễ dàng hơn khi thực hiện bằng cách sử dụng byte[] (mảng byte) hoặc BitSet s.

+0

Ban đầu tôi đã xem xét sử dụng byte [] nhưng từ những gì tôi hiểu, byte trong mảng byte vẫn được ký, và điều này đòi hỏi một chút "thao tác để làm việc. – kuhnto

1

Bạn có thể sử dụng ByteBuffer như được mô tả ví dụ: here. Nó sẽ làm cho nó dễ dàng hơn để thao tác mảng byte, đặc biệt là lấy những thứ như endianess vào tài khoản.

+0

Đó là một bài viết thực sự hay. – kuhnto

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