2016-10-18 3 views
0

높은 데이터 전송률을 가진 프로토콜을 사용 중이므로 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을 구문 분석하려면? 랜덤 바이트가 걸려있는 경우를 대비하여 tax을 모두 0으로 설정합니다.

업데이트

문서는 크지 않다. 먼저 Float32-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이라고 말하지 않습니다, 나는 그 가정을하고 있습니다.

+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); 

HTH

[편집

memcpy (&t, buffer, 2); 

에 : 아래로 내 대답을 투표하는 모든 사람들에게 명확히하기 위해, 문제는 실제로 주위에 인수를 잘못된 방법이 없습니다. 버퍼를 읽으려고 시도하지만 memcpy의 대상으로 지정]

+0

downvoter가 아니지만 반 정밀도 float에서 단 정밀도 float으로 복사 바이트가 작동하지 않습니다. – LPs

+0

@LPs 이해하지만 OP가 왜 모든 0을 얻는 지 알 수 없습니다. 실제로 버퍼에서 읽을 때까지는 memcpy가 왜 실수로 작동하지 않는지 알 수 없습니다. – Lelanthran

관련 문제