2013-03-08 5 views
0

У меня есть эта проблема. У меня есть полезная нагрузка, которая динамически меняет ее длину. Если я не отрежу эту полезную нагрузку, у меня появятся также сведения, которые являются мусором для меня. Поэтому я хочу сократить полезную нагрузку в базе моей длины полезной нагрузки.Сдвиг и маскировка в C

У меня есть эта часть кода:

uint64_t data_tmp = HTONLL((uint64_t) zp->data); 
uint8_t len = zp->length; 
uint64_t mask = 0xFFFF >> (64 - len); 
data_tmp = data_tmp & mask; 
printf("DATA_TMP = %llu\n", data_tmp); 

zp-> данные после того, как написано в t-> поле полезной нагрузки. Так что это моя полезная нагрузка. Это 64-битное поле.

Я хочу временно взять эту полезную нагрузку. Рассчитайте мою длину полезной нагрузки, то есть поле длины zp->, типа uint8. После того, как я создам маску, которая сдвигает 64 байта - payload_length, таким образом, что я могу применить ее к временной полезной нагрузке и получить поле с только данными, которые я хочу, и всеми нулями.

Как я могу это сделать?

Например. Если payload_length равно 01 и полезная нагрузка 00 + .............. (мусор) Я хочу получить полезную нагрузку, такую ​​как 00000000 на 64 байт.

Если моя полезная нагрузка равна 13 и полезная нагрузка 1284732089322309 .... Я хочу получить только байты тирхина.

Извините, если это трудно сказать ...

+4

Мне кажется, что вам нужны бинарные, а не логические и. try 'data_tmp = data_tmp & mask' – Kyborek

+0

как объявляется' zp-> data'? – user2116939

+0

Является ли ваша полезная нагрузка 64 бита или 64 байта? –

ответ

0

Вы это нужно:

uint64_t mask = (1uLL << (len * 4)) - 1; 
data_tmp = data_tmp & mask; 

Это даст вам низкийlen 4-бит ди мерзавцы. Если вам нужно больше всего, вы можете повернуть data_tmp перед нанесением маски:

data_tmp >>= (64 - len * 4) 
+0

Большое спасибо !!! – sharkbait

1

Не уверен, что, если я понял ваш вопрос правильно, но вы используете логическое И вместо двоичной AND.

выражение «переменная & & переменная» имеет значение 1 или 0

выражение «переменная & переменная» оценивает в двоичную и который, с правильной маской, будет обрезать данные, как вы Propably предназначены

Смежные вопросы