2012-02-08 30 views
6

Tôi đã được trao một tài liệu định nghĩa một tập hợp các thư được truyền và nhận qua một kênh truyền thông nối tiếp. Tôi muốn nhận các tin nhắn đến và deserialize chúng vào các đối tượng, và serialize tin nhắn gửi đi của tôi là tốt. Mã hóa trên dây được thiết lập và không thể thay đổi, và bao gồm bitfields khác nhau trong tiêu đề và trọng tải khác nhau, ví dụ:Nối tiếp và sắp xếp lại một trường bit

class Message{ 
int msg_num : 7 
int dest_addr : 4 
bool SRR : 1 
bool IDE : 1 
int source_addr : 6 
//... and so on... 
} 

Tôi đã xem xét việc sử dụng protobufs, nhưng có vẻ như phương pháp varint của họ về mã hóa là thành lập. Tôi cũng đã xem xét boost-serialization, nhưng dựa trên những gì tôi đã đọc cho đến nay, cách mã hóa được thực hiện ở đó không hoàn toàn rõ ràng.

Vì vậy, một số câu hỏi:

  • Tôi có thể sử dụng tăng-serialization để chuyển đổi bytestream của tôi để đối tượng?
  • Với mục tiêu không phải cuộn các thói quen của riêng tôi để tuần tự hóa (một mớ hỗn độn), có cơ chế ưu tiên để hoàn thành nhiệm vụ của tôi hay không.)
+0

Liệu "int msg_num: 7" có nghĩa là lĩnh vực này là 7 bit số nguyên ? – grieve

+0

Có. ": Num" cho biết độ dài của bitfield – jdt141

+0

Tôi thấy câu hỏi này khó trả lời, vì chỉ có biểu diễn được đóng gói được hiển thị chứ không phải các đối tượng tin nhắn chưa được giải nén mà bạn muốn nối tiếp và deserialise. –

Trả lời

1

Tôi nghĩ bạn sẽ không tìm thấy trình nối tiếp dễ sử dụng sẽ khớp với giao thức tùy chỉnh mà bạn đang xem. Nhưng nó trông tập hợp các nguyên thủy bạn có (int, bool + size) đủ đơn giản để có thể viết bộ giải mã/bộ giải mã của riêng bạn. Chỉ cần tạo mã C/C++ dựa trên thông báo nhận được. Nó nên được khá đơn giản nhiệm vụ để tạo ra một mã compilable lấy mô tả như vậy. Nó phải là một thế hệ tự động được thực hiện tại thời gian biên dịch - tương tự như những gì protobuf/Corba đang làm.

Ví dụ: từ đặc điểm kỹ thuật:

class Message{ 
    int msg_num : 7 
    int dest_addr : 4 
    bool SRR : 1 
    bool IDE : 1 
    int source_addr : 6 
    //... and so on... 
} 

bộ chuyển đổi có thể viết một hàm với cơ thể tương tự như (ký hiệu trừu tượng và giả định MSB):

Decoder:

m = new Message() 
{ 
    long long val = 0 
    for(int i=0; i<7; i++) { 
     val <<= 8 
     val += nextByte()  
    } 
    m.msg_num = val 
} 
{ 
    long long val = 0 
    for(int i=0; i<4; i++) { 
     val <<= 8 
     val += nextByte()  
    } 
    m.dest_addr = val 
} 
{ 
    int val = nextByte() 
    m.SRR = val 
} 
{ 
    int val = nextByte() 
    m.IDE = val 
} 
{ 
    long long val = 0 
    for(int i=0; i<6; i++) { 
     val <<= 8 
     val += nextByte()  
    } 
    m.source_addr = val 
} 
// and so on 

mã hóa:

{ 
    long long val = m.msg_num 
    for(int i=0;i<7;i++) { 
     writeByte(val & 0xFF) 
     val >>= 8 
    } 
} 
{ 
    long long val = m.dest_addr 
    for(int i=0;i<4;i++) { 
     writeByte(val & 0xFF) 
     val >>= 8 
    } 
} 
.... 

Điều đó khá dễ tạo và cách đơn giản nhất để đảm bảo mã hóa là tùy chỉnh.

+0

AFAIK tiêu chuẩn không bắt buộc thực hiện sử dụng bất kỳ loại nào khác với int cho các trường bit (ngay cả khi bạn viết mã của bạn một kiểu khác, ví dụ char hoặc bool) và tiêu chuẩn cũng để nó thực hiện cho dù các trường bit là đặt hàng trong bộ nhớ MSB để LSB hoặc cách khác xung quanh. Bởi vì byte tuần tự hóa theo byte có thể có vấn đề với các trường bit. – selalerer

+1

Chắc chắn. Câu trả lời của tôi là một ví dụ, hơn là giải pháp - tùy thuộc vào cách chính xác các byte được gửi qua dây, việc triển khai chính xác nên phản ánh giao thức. Nó đã được nhiều hơn để hiển thị các ý tưởng làm thế nào nó có thể được thực hiện: tạo ra các mã chuyển đổi nên làm công việc. –

0

Trong trường hợp bạn bị giới hạn ở một nền tảng duy nhất (nghĩa là giới hạn với thứ tự byte đơn) và Thư là loại POD, bạn có thể khai báo thư của mình là primitive.

Nếu không, trong trường hợp boost.serialization ít nhất, bạn sẽ phải viết mã, tức là 'thói quen cho tuần tự hóa'. Nó hỗ trợ chuyển đổi thứ tự byte, ít nhất

[Chỉnh sửa] sai, nó không phải primitive, tôi bị mất trong chiều sâu của tài liệu serialization

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