Как преобразовать последовательность из uint16 в float32? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть последовательность [66 106 179 86] (эти числа - два 16-битных регистра в Modbus), сгенерированные библиотекой Modbus ( код преобразования ), теперь как я могу преобразовать эту последовательность в 32-значное число?

Я пробовал []uint32{66,106, 179, 86} в качестве аргумента для Float32frombits, но не принимает списки uint32.

1 Ответ

0 голосов
/ 16 мая 2018

Использование math.Float32fromBits()

Мы можем использовать math.Float32fromBits(), чтобы получить значение float32 из его «двоичного» представления. Но чтобы его использовать, нам нужны 4-байтовые данные, упакованные в значение uint32. Для этого мы можем использовать binary.ByteOrder.Uint32():

data := []byte{66, 106, 179, 86}

bits := binary.BigEndian.Uint32(data)
f := math.Float32frombits(bits)
fmt.Println(f)

Вывод (попробуйте на Go Playground ):

58.675133

Это решение быстрее, если мы просто хотим прочитать одно float32 значение.

Использование binary.Read()

Другой вариант - использовать binary.Read() для заполнения значений фиксированного размера из io.Reader. Если у нас есть данные в виде байтового среза, мы можем использовать bytes.NewBuffer(), чтобы получить из него io.Reader:

data := []byte{66, 106, 179, 86}
var f float32
err := binary.Read(bytes.NewBuffer(data), binary.BigEndian, &f)
fmt.Println(f, err)

Вывод (попробуйте на Go Playground ):

58.675133 <nil>

Это решение предпочтительнее, если нам нужно прочитать серию float32 значений из ввода.

...