2013-02-22 38 views
5

Đối với một tiêu chuẩn truyền thông được chỉ định RTCM SC104 3.1, tôi cần chia dữ liệu qua byte thành một cặp đoạn dữ liệu 12 bit. Vì vậy, đối với một tin nhắn nhất định, tôi cần phải đặt số loại tin nhắn trên byte đầu tiên và một nửa của byte thứ hai. Sau đó, tôi cần phải bắt đầu một số nguyên ID trên một nửa byte thứ hai và tiếp tục đến byte thứ ba. Kiểu mẫu này tiếp tục đến cuối của thông điệp, cạo xuống các số nguyên khác trong 20bit, 5bit, và các kích cỡ khác về cơ bản là cắt các số 0 thường sẽ điền vào cuối MSB của các giá trị số nguyên.Làm cách nào để truy cập một byte đơn nguyên?

Tôi chưa thấy định nghĩa rõ ràng nhưng tôi cho rằng nó phải đi ra ngoài theo thứ tự byte mạng vì vậy trước khi sao chép bit, tôi sẽ phải đảo ngược số nguyên trong bộ nhớ. Tôi vẫn còn khá mới để cpp và tôi tự hỏi làm thế nào để tôi nhận được để các byte cá nhân tạo nên một số nguyên trong bộ nhớ? Nếu tôi có thể truy cập các byte sau đó tôi có thể sử dụng bitwise hoặc để tách các bit từ 2 byte lên một cho tin nhắn.

Đây là sự khởi đầu của việc xây dựng một thông điệp trước khi thêm dữ liệu:

//build message 1002 gps 00111110 1010 
    char buf1002[BUFFERSIZE]; 
    buf1002[0] = 0x3E; //00111110 
    buf1002[1] = 0xA0; //10100000 
//ref station id 12 bits of 16 
//ex unsigned short m = 1100; 
//m would be byte2 00000100 byte1 01001100 
//buf1002[1] would be 10100100 
//buf1002[2] would be 01001100 
//reverse bit order for network after building? 

Trạm tham chiếu sẽ được từ hiện tượng chập mạch, do đó, một số nguyên 2 byte unsigned. Vì vậy, làm thế nào để tôi đi về đọc một byte duy nhất từ ​​nó? Tôi có bắt đầu với con trỏ vị trí bộ nhớ không? Nếu vậy thì sao?

Mọi trợ giúp sẽ được đánh giá cao.

+0

Đọc câu trả lời đầu tiên tại đây http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c –

+4

* "Trạm tham chiếu sẽ là từ một unsigned ngắn, do đó, một số nguyên 2 byte. "* Một ngắn không phải là cần thiết để được hai byte (mặc dù đó là bởi đến nay trường hợp phổ biến nhất), nó được yêu cầu phải được tại * ít nhất * 16 bit. Bạn có thể sử dụng 'uint16_t' để buộc vấn đề. – dmckee

Trả lời

0

Bạn có thể dùng đến punning nó như byte, ví dụ:

const unsigned short s(1); 
const char* const bytes(reinterpret_cast<const char*>(&s)); 

const char NaturalOrder[sizeof(s)] = {bytes[0],bytes[1]}; 
const char EndianFlipped[sizeof(s)] = {bytes[1],bytes[0]}; 

(Nhưng cũng thấy bình luận dmckee của liên quan đến kích thước tự nhiên của builtins, và cân nhắc sử dụng các loại chiều rộng cố định).

2

Nếu bạn có số nguyên của bạn trông như 00.001.000 00000000 11000000 00.110.000 ví dụ (tôi là làm cho không gian sự khác biệt mỗi byte duy nhất), chứa trong ví dụ trong một int a:

int  a; 
int  single_byte; 

a = the_number; 

Bạn có thể làm một chức năng như

int  get_byte_in_integer(int byte_number, int integer); 

Vì vậy mà:

single_byte = get_byte_in_integer(1, a); // That would give you the 11000000 byte 

với

int get_byte_in_integer(int byte_number, int integer) 
{ 
     return (integer >> (byte_number << 3)) & 0xff); 
} 

Hy vọng điều này sẽ giúp, đối với phần byte.

4

Bạn có thể sử dụng các trường chút, như thế này - hãy cẩn thận ở cuối:

typedef union packet { 
    struct { 
     unsigned int msgno : 12; // creates a 12 bit wide integral field 
     unsigned int msgtype : 12; 
     unsigned int somefield2 : 3; 
     unsigned int somefield3 : 5; 
    } fields; 

    unsigned char asbytes[4]; 
} packet; 

... 

packet p; 
// fill it, by using the field side of the union 
p.fields.msgno = 16; 
p.fields.msgtype = 12; 
p.fields.somefield2 = 6; 
// and retrieving them as regular bytes 
unsigned char abyte = p.asbytes[0]; 
abyte = p.asbytes[1]; 
// and so on 

Đối với tôi Ưu điểm chính là khả năng đọc: tất cả các hoạt động hành xử giống như hoạt động thường xuyên trên mặc dù các biến kiểu tích phân hẹp hơn.Có những hạn chế (ví dụ như tính di động) nhưng nếu bạn không phải nhắm mục tiêu nhiều kiến ​​trúc hoặc trình biên dịch hoặc các trình kết thúc khác nhau, nó có thể giúp chương trình của bạn dễ đọc hơn nhiều.

+0

Tôi thích ý tưởng của bạn. Đó là một cách tiếp cận hoàn toàn khác để xây dựng toàn bộ thông điệp trong một mảng mà tôi có thể gửi ra khỏi ổ cắm. Phải mất một lúc tôi mới hiểu ra nó đang làm gì. –

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