Как сдвинуть и объединить, чтобы получить правильный результат?

В настоящее время я борюсь с Modbus TCP и столкнулся с проблемой интерпретации ответа модуля. Ответ содержит два значения, которые закодированы в битах массива из трех UInt16 значения, где первые 8 битов r[0] должны игнорироваться.

Допустим, массив UInt16 называется r и "окончательные" значения, которые я хочу получить val1 а также val2тогда я должен был бы сделать следующее:

6

В приведенном выше примере желаемые выходные значения val1 (=3) и val2 (=6) для входных значений r[0]= 768, r[1]= 1536 и r[2]=0, все значения как UInt16.

Я уже пытался (по логике) bit-rightshift r[0] на 8, но тогда старшие биты теряются, потому что они хранятся в первых 8 битах r[1], Должен ли я сначала объединить все r-значения и сдвиг битов после этого? Как я могу это сделать? Заранее спасибо!

1 ответ

Решение

Я уже пытался (логически) сместить бит-права r[0] на 8, но затем старшие биты теряются, потому что они хранятся в первых 8 битах r[1].

Ну, они не "потеряны" - они просто в г [1].

Это может быть проще всего разбить на шаг за шагом:

byte val1LowBits = (byte) (r[0] >> 8);
byte val1HighBits = (byte) (r[1] & 0xff);
byte val2LowBits = (byte) (r[1] >> 8);
byte val2HighBits = (byte) (r[2] & 0xff);

uint val1 = (uint) ((val1HighBits << 8) | val1LowBits);
uint val2 = (uint) ((val2HighBits << 8) | val2LowBits);
Другие вопросы по тегам