新的卫星数据处理中心刚刚完成,可以使用从轨道卫星发送的实时数据进行初步测试。由于屏幕上显示的是第一条消息,您发现许多数据值远远超出范围 例如,在终端屏幕上定义为“增量时间”并且它似乎超出预期范围[0.01到10,000.00秒],但显示的值(作为双倍)是 [ - 4.12318024e- 028秒] 。在对基于字节的原始数据流进行进一步调查之后,您会发现原始数据是从卫星发送的,用于此双字的 [0xC0 0x83 0xA1 0xCA 0x66 0x55 0x40 0xBA] 。在其中一个旧终端上,此数据正确显示并且在预期范围内。
a. [5] What caused this problem?
b. [5] If this is the real problem, what should the actual value be?
答案 0 :(得分:0)
好吧,其他终端正确显示数据 - >终端和数据之间存在不兼容性。
大端,小恩吉安也许?我期待“旧”终端是小端,因为它可能已用C编码。现在你可以解释数据。这是一些代码
#include <stdio.h>
union myW {
double x;
// Recieved as:[0xC0 0x83 0xA1 0xCA 0x66 0x55 0x40 0xBA]
unsigned char d[8] = {0x83, 0xC0,0xCA, 0xA1, 0x55, 0x66, 0xBA, 0x40};
};
union myBad {
double x;
// Recieved as:[0xC0 0x83 0xA1 0xCA 0x66 0x55 0x40 0xBA]
unsigned char d[8] = {0xC0, 0x83,0xA1, 0xCA, 0x66, 0x55, 0x40, 0xBA};
};
int main(void)
{
myW value;
value.x = 1.0; // check how reasonable number looks like
printf("Something reasonable: \n");
for(int i = 0; i < 8; i++)
{
printf("%u ", value.d[i]);
}
myW received;
printf("\nWhat shouldve been displayed:\n");
for(int i = 0; i < 8; i++)
{
printf("%u ", received.d[i]);
}
printf("\n%f\n", received.x);
myBad bad;
printf("\nBad output as:\n");
for(int i = 0; i < 8; i++)
{
printf("%u ", bad.d[i]);
}
printf("\n%0.30f\n", bad.x);
}
输出:
Something reasonable:
0 0 0 0 0 0 240 63
What shouldve been displayed::
131 192 202 161 85 102 186 64
6758.334500
Bad output as:
192 131 161 202 102 85 64 186
-0.000000000000000000000000000412
使用g ++编译