2009-08-17 39 views
12

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

+0

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

+0

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

Trả lời

4

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.

+0

Cảm ơn Brian, tôi đoán Swig chắc chắn sẽ giúp – Rohin

4

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à đủ.

5

Có một số thư viện trợ giúp trong lĩnh vực này. Một trong những đơn giản nhất để sử dụng (trình điều khiển chú thích) chắc chắn là Preon

+0

doh, đánh tôi với nó. Tôi cần phải đọc kỹ hơn trước khi soạn một câu trả lời dài –

+0

nhưng câu trả lời của bạn là ** tốt hơn ** – dfa

1

java.nio có ByteBuffer, hỗ trợ lật thứ tự byte khi đọc và ghi, khi đang di chuyển nếu cần.

8

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.