2016-10-18 36 views
0

我正在使用具有高數據速率的低級協議,因此根據數字範圍使用2或3字節來表示float使系統更高效。將2個字節或3個字節轉換爲C中的浮點型號

我試圖解析這些數字,但我得到的值對我來說沒有意義,它們都是零,我不認爲該設備會爲有問題的變量輸出零。

第5周在我的緩衝區的字節是:FF-FF-FF-FF-FF

前兩個字節組成一個float t。應該指出的是,文件說這些字節是小尾數。

爲了解析t我做的:

float t = 0; 
memcpy(buffer, &t, 2); 

接下來的3個字節組成float ax,解析,我這樣做:

float ax = 0; 
memcpy(buffer+2, &ax, 3); 

這是處理這一正確的方法是什麼?我將tax都設置爲零,以防隨機字節懸空。

更新

的文檔不是很大。首先,他們將Float定義爲32-bit IEEE 754 floating-point number

然後是這句話:

To increase efficiency many of the data packets are sent as 24-bit signed integer words 
because 16-bits do not provide the range/precision required for many of the quantities, 
whereas 32-bit precision makes the packet much longer than required. 

然後是其中t定義爲前2個字節的緩衝器的表中。它指出範圍是0-59.999。它並沒有明確說它是一個Float,我只是在做這個假設。

+4

如果您在討論binary16 [半精度](https://en.wikipedia.org/wiki/Half-precision_floating-point_format),則不能只需將字節複製到binary32 [單精度](https://en.wikipedia.org/wiki/Single-precision_floating-point_format)。您必須管理轉換。我從來沒有聽說過有關3字節浮點數的東西... – LPs

+0

我同意@LPs在這裏。 IEEE-754通常用於表示浮點數。你不能只讀一個浮點數的最低'n'個字節,並且假設你已經選擇了數字'x'精度。欲瞭解更多信息,請參閱https://thirum.al/2dk4tx9 – zapstar

+0

C是這種事情的痛苦:UB只是一箭之遙。你肯定會在這裏建立一個非常具體的平臺:一個3字節的浮點數很時髦。如果我是你,我會考慮幾行內聯彙編:你有3個字節的寄存器嗎? – Bathsheba

回答

-3

可能你的論點是錯誤的。更改如下:

memcpy (buffer, &t, 2); 

memcpy (&t, buffer, 2); 

HTH

[編輯:澄清所有這些人投票我的回答下來,這個問題確實有參數的錯誤的方式左右。嘗試讀取緩衝區,但將其指定爲memcpy的目標]

+0

不是downvoter,但從半精度浮點複製字節到單精度浮點數不起作用.... – LPs

+0

@LPs我明白,但OP不知道他爲什麼得到全零。直到他真的從緩衝區讀取數據,他纔會知道爲什麼memcpy不能用於浮動。 – Lelanthran

相關問題