높은 데이터 전송률을 가진 프로토콜을 사용 중이므로 2 또는 3 바이트를 사용하여 숫자 범위에 따라 float
을 나타냅니다. 시스템을보다 효율적으로 만드십시오.2 바이트 또는 3 바이트를 C에서 float로 변환
이 숫자를 파싱하려고하지만 값은 내가 이해할 수 없지만, 모두 0이며 디바이스가 해당 변수에 대해 0을 출력한다고 생각하지 않습니다. 내 버퍼
처음 5 바이트는 다음과 같습니다 FF-FF-FF-FF-FF
처음 두 바이트는 float t
을 구성합니다. 문서는 바이트가 리틀 엔디안이라고 말합니다.
float t = 0;
memcpy(buffer, &t, 2);
다음 3 바이트는 float ax
만들어, 내가 할 것으로 구문 분석 :
float ax = 0;
memcpy(buffer+2, &ax, 3);
이이 처리하는 올바른 방법인가
내가 할 t
을 구문 분석하려면? 랜덤 바이트가 걸려있는 경우를 대비하여 t
과 ax
을 모두 0으로 설정합니다.
업데이트
문서는 크지 않다. 먼저 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.
그런 다음 상기 버퍼의 제 2 바이트로
t
정의 테이블있다 :
다음이 인용있다. 범위는 0-59.999입니다. 그것은 명시 적으로 그것이 Float
이라고 말하지 않습니다, 나는 그 가정을하고 있습니다.
binary16 [반 정밀도] (https://en.wikipedia.org/wiki/Half-precision_floating-point_format)에 대해 이야기하는 중이라면 바이트를 binary32 [단 정밀도] (https://en.wikipedia.org/wiki/Single-precision_floating-point_format)로 간단히 복사하십시오. 전환을 관리해야합니다. 나는 3 바이트에 관한 무언가가 떠돌아 다니는 것을 들어 본 적이 없다 ... – LPs
나는 여기에 @LPs에 동의한다. IEEE-754는 일반적으로 부동 소수점 숫자를 나타내는 데 사용됩니다. 부동 소수점 숫자의 가장 낮은 'n'바이트를 읽을 수 없으며 숫자를'x' 정밀도로 선택했다고 가정합니다. 더 자세한 정보는 https://thirum.al/2dk4tx9 – zapstar
C는 이런 종류의 고통입니다. UB는 단지 돌이려 던 것입니다. 당신은 확실하게 여기에 매우 특정한 플랫폼을 구축하고 있습니다 : 3 바이트 부동은 펑키합니다. 내가 당신이라면 두 줄의 인라인 어셈블리를 고려할 것입니다. 3 바이트 레지스터가 있습니까? – Bathsheba