Как я могу преобразовать 1 байт данных в 2 байта данных

Я хочу преобразовать 1 байт элемента массива в 2 байта Например

arr[size] = {0x1F};

Итак, я хочу, чтобы 0x1F хранился в 2-й массив вроде,

arr_2[size] = {0x01, 0x0f}

Я пробовал следующим образом...

for(i=j=0; j<2; i++){

arr_2[j]  =(0xF0 & arr[i]) >> 4;
arr_2[j++]=(0x0F & arr[i]);

}

Спасибо заранее..!!

1) Вы пишете в один и тот же элемент arr_2 в обоих операторах. 2) Используете ли вы неподписанные типы? (посмотрите, что делает приращение поста) (посмотрите технические детали сдвига вправо) Кроме того, может быть неоднозначно, какой результат вы хотите - числовые значения полубайта или кодировки символов (которых у вас здесь нет).

Avi Berger 02.02.2023 18:52

Попробуйте: arr_2[j++]=(0x0F & arr[i]); ---> arr_2[++j]=(0x0F & arr[i]); Тем не менее... ваш цикл не очень полезен для преобразования одного значения

Support Ukraine 02.02.2023 18:56
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
2
123
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

На самом деле вы все делаете правильно, кроме оператора цикла for.

for(i=j=0; j<2; i++){

arr_2[j]  =(0xF0 & arr[i]) >> 4;
arr_2[j++]=(0x0F & arr[i]);

}

в теле которого вы устанавливаете как минимум один и тот же элемент массива arr_2 дважды.

Это избыточно.

Вы могли бы просто написать

arr_2[0]  =(0xF0 & arr[0]) >> 4;
arr_2[1] = 0x0F & arr[0];

Чтобы опираться на ответ Влада, возможно, вы использовали цикл, потому что действительно хотите расширить n байтов до n * 2 байтов.

for ( size_t i = 0; i < n; ++i ) {
   dst[ i*2+0 ] = ( src[ i ] >> 4 ) & 0xF;
   dst[ i*2+1 ] = ( src[ i ] >> 0 ) & 0xF;
}

или

for ( size_t j = 0, i = 0; i < n; ++i ) {
   dst[ j++ ] = ( src[ i ] >> 4 ) & 0xF;
   dst[ j++ ] = ( src[ i ] >> 0 ) & 0xF;
}
Ответ принят как подходящий

Вы почти достигли цели, но не использовали правильный синтаксис for() для увеличения количества итераторов.

Пример:

#define SIZE 1                      // for example, but the same principles 
                                    // would apply for malloc'd arrays
unsigned char arr[SIZE] = {0x1F};   // 'SIZE' bytes
unsigned char arr_2[SIZE * 2];      // You'll end up with twice as many bytes.


// ...
int i, j;

// note how we test the input iterator (i) against the input size and how
// the output iterator (j) is incremented by 2 on each iteration

for (i = 0, j = 0; i < SIZE; i++, j += 2)
{
    arr_2[j]     = (arr[i] & 0xF0) >> 4;
    arr_2[j + 1] = arr[i] & 0x0F;
}

Спасибо, Майкл, это сработало для меня. Принимая это как ответ.

Bhushan Mahajan 02.02.2023 19:42

Э... простите... В теле цикла for() оба оператора маскируют младшие 4 бита. Это неправильно и должно быть исправлено.

Fe2O3 02.02.2023 20:56

Вам не нужно поддерживать две переменные индекса. Вот решение, предполагающее, что вы хотите хранить элементы в массиве, вдвое превышающем длину исходного массива:

#include <stdio.h>

#define LEN(arr) (sizeof (arr) / sizeof (arr)[0])

int main(void)
{
    unsigned char arr[] = {0x1f, 0x2f, 0x3f, 0x4f};
    unsigned char arr_2[2 * LEN(arr)];
    size_t i;

    for (i = 0; i < LEN(arr); i++) {
        arr_2[2 * i] = arr[i] >> 4;
        arr_2[2 * i + 1] = arr[i] & 0x0f;
    }
    for (i = 0; i < LEN(arr_2); i++) {
        printf("%x", arr_2[i]);
    }
    printf("\n");
    return 0;
}

Выход:

1f2f3f4f

Другие вопросы по теме