Tôi phải mã chương trình Java sẽ nhận tin nhắn từ mạng và hiển thị nội dung của họ cho người dùng. Vấn đề là các thông điệp mà tôi nhận được chỉ đơn giản là các khối nhị phân của các cấu trúc C. Thêm vào đó một số thông điệp đến từ các máy cuối nhỏ và một số từ phần cuối lớn mà không có các trường được chuyển đổi sang thứ tự byte mạng. Một cách tôi có là sử dụng JNI và chuyển đổi các cấu trúc c thành một chuỗi XML và sau đó de serialize chuỗi XML này thành một đối tượng Java. Đây là một công việc khó khăn vì có khoảng 122 cấu trúc khác nhau và mỗi một trong số chúng chứa hơn 20 trường. Tôi tự hỏi nếu có một thư viện/công cụ/phương pháp mà có thể làm cho công việc của tôi một chút dễ dàng?Sử dụng cấu trúc C trong Java
Trả lời
Swig sẽ xử lý rất nhiều công việc lặp đi lặp lại tẻ nhạt cho bạn trong việc lập bản đồ cấu trúc C cho các đối tượng Java. Hãy xem Swig/Java manual và mục nhập trên wrapping C structures.
Cảm ơn Brian, tôi đoán Swig chắc chắn sẽ giúp – Rohin
Bạn có thể sử dụng DataInputStream
để tải dữ liệu từ bất kỳ InputStream
nào. Miễn là bạn biết bố cục chính xác của cấu trúc của bạn, điều này là đủ.
java.nio có ByteBuffer, hỗ trợ lật thứ tự byte khi đọc và ghi, khi đang di chuyển nếu cần.
Có một thư viện gọi là Preon được thiết kế để giúp bạn với loại nhiệm vụ này: Preon site Về cơ bản, họ cố gắng giữ tất cả logic để đọc thơ của bạn từ luồng nhị phân trong chú thích gắn với từng trường trong thơ của bạn.
Một ví dụ từ tài liệu của họ, nơi bạn kiểm soát kích thước của int bạn đang đọc:
class Rectangle
{
@BoundNumber(size="16") private int x1;
@BoundNumber(size="16") private int y1;
@BoundNumber(size="16") private int x2;
@BoundNumber(size="16") private int y2;
}
hoặc để xác định endianness:
class Rectangle
{
@BoundNumber(byteOrder=LittleEndian) private int x1;
@BoundNumber(byteOrder=LittleEndian) private int y1;
@BoundNumber(byteOrder=LittleEndian) private int x2;
@BoundNumber(byteOrder=LittleEndian) private int y2;
}
Bạn thậm chí có thể sử dụng mini-phương trình với tham chiếu đến các giá trị trong các trường trước để chỉ định kích thước/độ dài, v.v.
@BoundList(size="width * height") byte[] pixels;
@BoundNumber(size="nrBits * 2") int value;
Ồ, và chúng là lso cung cấp logic điều kiện, tất cả trong chú thích.
- 1. Sử dụng ghi nhớ về cấu trúc trong C++
- 2. Làm thế nào để sử dụng cấu trúc trong C?
- 3. Sao chép cấu trúc vào cấu trúc trong C
- 4. Gửi cấu trúc C++ qua UDP trong Java
- 5. Cấu trúc nhiều cột Java
- 6. Cấu trúc được sử dụng trong DBMS
- 7. Cấu trúc dữ liệu C#
- 8. Cấu trúc src/thư mục trong C++?
- 9. C# - Cấu trúc cây xâm nhập, sử dụng CRTP
- 10. Làm thế nào để chuyển một cấu trúc C sang java bằng cách sử dụng JNI?
- 11. Cấu trúc Constructor trong C++?
- 12. Cấu trúc tĩnh trong C++
- 13. C++ Cấu trúc riêng
- 14. Cấu trúc ứng dụng sử dụng WCF
- 15. Cấu trúc tệp Java trong bộ nhớ?
- 16. Cấu trúc rỗng trong C và cấu trúc rỗng trong C++
- 17. Tạo cấu trúc dữ liệu như cấu trúc dữ liệu trong Java
- 18. Mảng bên trong cấu trúc trong C
- 19. Java - cấu trúc thay đổi int enums
- 20. Tạo cấu trúc C trong Cython
- 21. Chuyển cấu trúc tới C++ API bằng cách sử dụng Marshal.StructureToPtr trong C#
- 22. Cấu trúc cục bộ trong c
- 23. Cấu trúc có biến mẫu trong C++
- 24. C++ Cấu trúc thành viên cấu trúc không đổi
- 25. Căn chỉnh cấu trúc trong Visual C++
- 26. C++ cấu trúc vô danh
- 27. Kế thừa cấu trúc trong C++
- 28. tạo một mảng cấu trúc trong C++
- 29. C++: Lưu cấu trúc trong một đống
- 30. C++ Cấu trúc kế thừa trong Cython
Bạn có cơ hội sử dụng mạng CAN không? Nếu vậy, phân tích cú pháp tệp DBC sẽ là giải pháp tốt nhất. – gramm
Thật không may là một hệ thống viễn thông thích hợp. Tôi đang viết một công cụ gỡ lỗi mà sẽ rút ra các thông điệp được trao đổi giữa các mô-đun nội bộ của hệ thống .. loại sơ đồ lưu lượng cuộc gọi. – Rohin