Как сдвинуть и объединить, чтобы получить правильный результат?
В настоящее время я борюсь с Modbus TCP и столкнулся с проблемой интерпретации ответа модуля. Ответ содержит два значения, которые закодированы в битах массива из трех UInt16
значения, где первые 8 битов r[0] должны игнорироваться.
Допустим, массив UInt16 называется r
и "окончательные" значения, которые я хочу получить val1
а также val2
тогда я должен был бы сделать следующее:
В приведенном выше примере желаемые выходные значения 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);