Tôi gặp vấn đề khi tôi bị mắc kẹt và tôi được một đồng nghiệp thông báo rằng đây sẽ là một nơi tốt để tìm sự giúp đỡ.Thực hiện một bitfield kiểu C trong Java
Tôi đang cố triển khai bitfield kiểu C trong Java. Đây là một ví dụ sơ bộ (tôi không có mã thực sự trước mặt tôi tại thời điểm này).
typedef union
{
typedef struct
{
unsigned short a :1;
unsigned short b :1;
unsigned short c :2;
unsigned short d :10;
} bitfield;
unsigned short bitmap;
}example_bitfield;
Tôi có một bit bit kiểu bit tương tự từ mã cũ. Lý do tôi cần đưa ra một phương thức tương đương cho Java là tôi đang làm việc trên mã sẽ sử dụng Java để giao tiếp với các ứng dụng kế thừa khác bằng cách sử dụng UDP.
Tôi không có tùy chọn viết lại mã. Tôi biết rằng cách tiếp cận này không phải là di động, có các vấn đề về endianness (và padding/alignment, ect), và có thể được thực hiện một cách tốt hơn nếu tôi có thể viết lại mã. Thật không may tôi cần một câu trả lời cho vấn đề rất cụ thể này. Hệ thống đã bị đóng và vì vậy tôi không cần phải lo lắng về mọi sự kết hợp có thể có của các trình biên dịch/hệ điều hành/ect.
Cách tiếp cận sử dụng Java EnumSet sẽ không hoạt động vì tôi tin rằng sẽ chỉ cho phép mỗi giá trị có một bit. Tôi cần để có thể đóng gói các giá trị với ví dụ giá trị của d chiếm 10 bit.
Tôi biết về Java Bitset nhưng nó có giới hạn. Tôi đang sử dụng một phiên bản Java cũ hơn, và vì vậy tôi không có một số phương thức Java Bitset mới hơn (Cụ thể là các phương thức valueOf chắc chắn sẽ giúp ích).
Có ai có bất kỳ ý tưởng nào về cách làm cho điều này dễ quản lý nhất có thể không? Tôi có trên 10 bitfield mà tôi cần phải thực hiện cho các liên lạc của mình.
Cảm ơn bạn đã được trợ giúp bạn có thể cung cấp!
Lưu ý rằng ví dụ ban đầu của bạn thực sự là một hành vi không xác định. – oldrinb
Vì bạn có phiên bản Java cũ và có giới hạn, bạn có thể cho chúng tôi biết nó là gì không? –
Đây là Java SE 6. Về mặt kỹ thuật, các bitfield đang được biên dịch bằng trình biên dịch C++. Tôi tin rằng C++ đã thêm hỗ trợ cho việc sử dụng các loại khác với số nguyên. Nếu nó không xác định, tôi có thể chấp nhận điều đó ... Tôi không có tùy chọn để sửa nó, và bất cứ hành vi nào nó hiện đang làm là những gì tôi phải cạnh tranh. – shadowisadog