2016-10-09 8 views
2

Новый центр обработки спутниковых данных только что был завершен и готов к первоначальному тестированию с использованием живых данных, отправляемых с орбитального спутника. Поскольку самые первые сообщения отображаются на экране, и вы замечаете, что многие из значений данных находятся вне пределов досягаемости.
Например, на экране терминала что-то определено как «время дельта», и оно кажется вне ожидаемого диапазона [от 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

Ах, анализ режима отказа. Очень важно!

Ну, другой терминал показывает данные правильно -> существует несовместимость между терминалом и данными.

Большой Эндиан, маленький Эндиан, возможно? Я ожидаю, что «старый» терминал будет мало 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); 
} 

Выход:

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 

Собран с г ++

+0

Я попытался реверсивные байт + реверс бит + XOR 0x80, а результат '2.39' .. Но ... как вы думаете, так как это проблема, результат, скорее всего, будет чем-то более «закругленным», например, «20.0» или что-то замечательное, например '3.14159' ... –

+0

Почему вы ожидаете этого? Потому что это «академическая» проблема? Он находится в ожидаемом диапазоне! [От 0,01 до 10,000.00 секунд] – Makketronix