卫星数据处理错误



一个新的卫星数据处理中心刚刚建成,准备使用轨道卫星发回的实时数据进行初步测试。当第一个消息显示在屏幕上时,您会注意到许多数据值远远超出了范围。
例如,在终端屏幕上定义为"增量时间",它似乎超出了预期的范围[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++编译

相关内容

  • 没有找到相关文章

最新更新