2011-01-21 58 views
5
unsigned char *adata = (unsigned char*)malloc(500*sizeof(unsigned char)); 
unsigned char *single_char = adata+100; 

Làm cách nào để thay đổi bốn bit đầu tiên trong single_char để biểu thị các giá trị giữa 1,10 (int)?Làm thế nào để thay đổi 4 bit trong unsigned char?

Câu hỏi đặt ra xuất phát từ cấu trúc TCP header:

Data Offset: 4 bits 

The number of 32 bit words in the TCP Header. This indicates where 
the data begins. The TCP header (even one including options) is an 
integral number of 32 bits long. 

Thông thường nó có giá trị của 4..5, giá trị char là như 0xA0.

Trả lời

7

Chúng có giả định rằng bạn đã khởi tạo * single_char thành một số giá trị. Nếu không, các giải pháp caf đăng tải những gì bạn cần.

(*single_char) = ((*single_char) & 0xF0) | val;

  1. (*single_char) & 11110000 - reset thấp 4 bit 0
  2. | val - Thiết lập 4 bit cuối cùng giá trị (giả sử val là < 16)

Nếu bạn muốn để truy cập 4 bit cuối cùng, bạn có thể sử dụng unsigned char v = (*single_char) & 0x0F;

Nếu y Bạn muốn truy cập 4 bit cao hơn, bạn chỉ cần thay đổi mặt nạ lên 4 tức là.

unsigned char v = (*single_char) & 0xF0;

và cài đặt chúng:

(*single_char) = ((*single_char) & 0x0F) | (val << 4);

+1

Trong trường hợp cụ thể của TCP header, thấp hơn 4 bit của octet này được dành riêng và phải bằng không. – caf

+1

Ah okay, sau đó giải pháp của bạn là tốt hơn :) – GWW

+0

@ GW, cuối cùng, đó là giải pháp của bạn mà làm việc cho tôi. Nhưng nó đôi khi đặt giá trị lạ .. (ví dụ, single_char trở thành hex 0x86 thay vì 0x80). –

3

Bạn có thể sử dụng bitwise operators để truy cập từng bit riêng lẻ và sửa đổi theo yêu cầu của bạn.

6

này sẽ thiết lập mức cao 4 bit của *single_char số liệu bù đắp, và rõ ràng thấp hơn 4 bit:

unsigned data_offset = 5; /* Or whatever */ 

if (data_offset < 0x10) 
    *single_char = data_offset << 4; 
else 
    /* ERROR! */ 
+0

Vì vậy, nó sẽ thay đổi 4 bit đầu tiên và sẽ không ảnh hưởng đến bit thấp hơn không? –

+0

@mhambra: "đầu tiên" là một vấn đề của ký hiệu - nó sẽ thay đổi * quan trọng nhất * 4 bit, đó là những gì bạn muốn cho trường đó của tiêu đề TCP. Như tôi đã viết, nó sẽ xóa (không) 4 bit thấp hơn - và điều này cũng tương tự như những gì bạn muốn cho tiêu đề TCP, nơi những bit dưới 4 được đặt trước và phải bằng không. – caf

2

Tôi biết đây là một bài đăng cũ nhưng tôi không muốn người khác đọc các bài viết dài về các toán tử bitwise để có được một func tion tương tự như những -

//sets b as the first 4 bits of a(this is the one you asked for 
void set_h_c(unsigned char *a, unsigned char b) 
{ 
    (*a) = ((*a)&15) | (b<<4); 
} 

//sets b as the last 4 bits of a(extra) 
void set_l_c(unsigned char *a, unsigned char b) 
{ 
    (*a) = ((*a)&240) | b; 
} 

Hy vọng nó sẽ giúp ai đó trong tương lai

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