一个新的卫星数据处理中心刚刚建成,准备使用轨道卫星发回的实时数据进行初步测试。当第一个消息显示在屏幕上时,您会注意到许多数据值远远超出了范围。
例如,在终端屏幕上定义为"增量时间",它似乎超出了预期的范围[0.01到10,000.00秒],但显示的值(作为双精度)是[-4.12318024e-028 seconds]。在进一步研究原始的基于字节的数据流之后,您会发现从卫星发送下来的这个双字的原始数据为[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?
啊,失效模式分析。确实非常重要!
嗯,其他终端显示数据正确——>终端和数据不兼容。
可能是大端语,小端语?我希望"旧的"终端是小的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%fn", received.x);
myBad bad;
printf("nBad output as:n");
for(int i = 0; i < 8; i++)
{
printf("%u ", bad.d[i]);
}
printf("n%0.30fn", 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++编译