UINT8에서 더블로 데이터를 추출합니다
-
12-12-2019 - |
문제
크기 (바이트 수) 인 다른 매개 변수가있는 uint8
포인터를 수신하는 C 함수가 있습니다.
이 버퍼에서 double
데이터를 추출하고 싶습니다.다음은 내 코드가 있습니다 :
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
for (i = 0; i < size; i++)
{
d = ((double*)&data)[i];
printf(" d = %d\n");
}
}
.
문제는 내가 외부 하드웨어 내에서 보내는 것을받지 못한다는 것입니다.나는 내 캐스트가 틀렸다고 생각한다.나는 다른 방법을 시도했지만 좋은 결과가 없어야합니다.나는 아직 내가 보내는 것을 얻을 수 없어.
해결책
내가 당신의 질문을 이해하면 (추출물을 추출 할 수있는 하나의 double
가있을 때 완전히 분명하지는 않습니다), 여기서 내가하는 일은 다음과 같습니다.
double Write(uint8* data, uint8 size)
{
double d;
if (size < sizeof(d))
return 0; // failure; you may want something smarter than this
memcpy(&d, data, sizeof(d));
return d;
}
.
이 피해지는 것은 d = *(double*)data
와 같은 주조의 잠재적 인 정렬 문제입니다.
데이터가 유효한 double
를 나타내지 않는 경우 홀수 및 추악한 방법으로 실패 할 수 있습니다 (예 : 하드웨어가 리틀 엔디안 이고이 코드를 실행하는 CPU는 큰 엔디안 또는 다른 방향으로 실행됩니다).
앨리어싱 문제가 적용되면 아직 모릅니다.다시 표준을 읽어야합니다.그래도 실제로는 결코 보지 못했습니다.
다른 팁
데이터가 실제로 배열이고 크기가 아일랜드 수이며 코드는 바이트 수입니다.
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
int i;
for (i=0; i<size/sizeof(double); ++i) {
d = ((double*)data)[i];
printf(" d = %g\n",d);
}
}
.
크기는 두 배 수가 아닌 바이트 수가 아니므로 크기가 두 배의 크기로 나누어야합니다.
이렇게하면 다음을 수행하십시오.
d = ((double*)&data)[i];
.
다음 데이터에 대한 포인터에 대한 포인터가 이중 포인터임을 말합니다.
또한 PRINTF 문이 다음과 같습니다.
printf(" d = %d\n");
.
int를 인쇄하라는 것을 알려 줬습니다 (% d는 int이지만 인쇄 할 실제 값이 없습니다.나는 그것을 % g으로 바꿨습니다. 이는 두 배를 가장 잘 맞는 형식으로 인쇄합니다.
Write(uint8* data, uint8 size) /* data and size are given by a callback to my function)*/
{
double d;
for (i=0; i<size; i++) {
d = ((double*)data)[i];
printf(" d = %d\n", d);
}
}
.
당신이 찾고있는 것처럼 추측하는 것입니다, 포인터는 실제로 복식 배열에 대한 포인터이므로 정확히