Time 卫星数据处理误差
一个新的卫星数据处理中心刚刚建成,并准备使用轨道卫星发送的实时数据进行初步测试。当第一条消息显示在屏幕上时,您会注意到许多数据值超出范围。Time 卫星数据处理误差,time,hex,double,word,satellite,Time,Hex,Double,Word,Satellite,一个新的卫星数据处理中心刚刚建成,并准备使用轨道卫星发送的实时数据进行初步测试。当第一条消息显示在屏幕上时,您会注意到许多数据值超出范围。 例如,终端屏幕上定义为“增量时间”,似乎超出了预期范围[0.01到10000.00秒],但显示的值(双精度)为[-4.12318024e-028秒]。在进一步调查基于原始字节的数据流后,您会发现从卫星发送的该双字的原始数据为[0xC0 0x83 0xA1 0xCA 0x66 0x55 0x40 0xBA]。在其中一个旧终端上,该数据显示正确且在预期范围内 a
例如,终端屏幕上定义为“增量时间”,似乎超出了预期范围[0.01到10000.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?
啊,失效模式分析。真的很重要 嗯,其他终端正确显示数据-->终端和数据之间存在不兼容 大恩迪安,也许是小恩迪安?我希望“旧”终端是little Endian,因为它可能是用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);
}
用g++编译时,我尝试了反向字节+反向位+异或0x80,结果是
2.39
。。。但是你不认为,既然这是一个问题,结果可能会更“全面”,比如20.0
,或者是一些引人注目的东西,比如3.14159
…你为什么期望这样?因为这是一个“学术”问题?它在预期范围内![0.01至10000.00秒]
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