Comment changer 4 bits en caractère non signé?

unsigned char *adata = (unsigned char*)malloc(500*sizeof(unsigned char)); unsigned char *single_char = adata+100; 

Comment changer les quatre premiers bits de single_char pour représenter les valeurs comsockets entre 1..10 (int)?

La question venait de la structure d’en-tête TCP:

 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. 

Habituellement, il a une valeur de 4..5, la valeur du caractère est comme 0xA0.

Ils supposent que vous avez initialisé * single_char à une certaine valeur. Sinon, la solution affichée par caf fait ce dont vous avez besoin.

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

  1. (*single_char) & 11110000 – Remet les 0 bits les plus bas à 0
  2. | val | val – Définit les 4 derniers bits sur valeur (en supposant que val est <16)

Si vous voulez accéder aux 4 derniers bits, vous pouvez utiliser le caractère unsigned char v = (*single_char) & 0x0F;

Si vous voulez accéder aux 4 bits supérieurs, vous pouvez simplement décaler le masque de 4, par exemple.

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

et pour les définir:

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

Ceci définira les 4 bits supérieurs de *single_char sur le décalage de données et *single_char les 4 bits inférieurs:

 unsigned data_offset = 5; /* Or whatever */ if (data_offset < 0x10) *single_char = data_offset << 4; else /* ERROR! */ 

Vous pouvez utiliser des opérateurs au niveau des bits pour accéder à des bits individuels et les modifier en fonction de vos besoins.

Je sais que ceci est un ancien post mais je ne veux pas que les autres lisent de longs articles sur les opérateurs au niveau des bits pour obtenir une fonction similaire à celle-ci –

 //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; } 

J'espère que ça aidera quelqu'un dans le futur