2016-11-15 6 views
0

Я новичок в знаках. Я пытаюсь преобразовать массив большого числа endian в шестнадцатеричную строку в маленьком конце. Я попытался преобразовать массив с большим эндианным целым в младшую десятичную строку. Но в конце, получив строчную кодировку с длинным десятичным десятичным символом вместо маленького endian. Пожалуйста, помогите мнепреобразовать подписанный целочисленный массив в формате big endian в hexa decimal 16 бит в little endian в c

gint16 frame[5] = {10, -26, 35, 7, -35}; //big endian 
gint16 frame_i[5]; 
size_t i; 
for (i= 0; i < 5; i++) { 
    frame_i[i] = (frame[i] << 8) | ((frame[i] >> 8) & 0xFF); //big endian to little endian 
} 
char *str = malloc(5 * 4 + 1); 
size_t j; 
for (j= 0; j < 5; j++) { 
    snprintf(str + j * 4, 5, "%04X", frame_i[j] & 0xFFFF); // getting big endian instead of little endian 
} 
+0

Я не могу себе представить, зачем нужна строка с маленьким шрифтом. Текстовые представления чисел всегда равны m.s. сначала цифра. Endianness не имеет никакого отношения к тому, как организованы массивы: проблема заключается в последовательности байтов в памяти, что многобайтовое значение естественно хранится процессором. Прочитайте [end about] (https://en.wikipedia.org/wiki/Endianness). –

+0

Кроме того, эта строка '(frame_i [i] << 8) | ((frame_i [i] >> 8) & 0xFF); 'не имеет никакого эффекта - значение выражения не назначается. –

+0

Пожалуйста, опубликуйте [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), который позволит избежать глупых ошибок в вопросе, оставляя сомнение в том, что может быть больше ошибок транскрипции. –

ответ

1

Выражение (frame_i[i] << 8) | ((frame_i[i] >> 8) & 0xFF); не имеет никакого эффекта (вы бы заметили, что, если бы вы использовали -Wall опцию компилятора). Кроме того, вы должны применять эту операцию на переменную frame и сохранить результат в frame_i, например:

int16_t frame[5] = {10, -26, 35, 7, -35}; 
int16_t frame_i[5] = {0}; 
size_t i; 

for (i = 0; i < sizeof(frame)/sizeof(int16_t); i++) { 
    frame_i[i] = (frame[i] << 8) | ((frame[i] >> 8) & 0xFF); 
} 

for (i = 0; i < sizeof(frame)/sizeof(int16_t); i++) { 
    printf("%04X -> %04X\n", frame[i] & 0xFFFF, frame_i[i] & 0xFFFF); 
} 

Выход

000A -> 0A00 
FFE6 -> E6FF 
0023 -> 2300 
0007 -> 0700 
FFDD -> DDFF 

Примечание как @WeatherVane уже отмечалось, правый сдвиг отрицательного знакового целого имеет поведение, определяемое реализацией. См. Ответы на вопрос this. Рассмотрим использование неподписанного типа, например. uint16_t от stdint.h.

+0

Для такого переключения используйте типы 'unsigned'? –

+0

@WeatherVane, вы имеете в виду, что правильная смена определена для подписания? –

+0

Да, я это имел в виду. –