Сокрытие двух uint32_varible в одном Uint8

У меня есть вопрос с преобразованием двух переменных uint32 и передачей их как одной переменной uin8. Я не уверен, как именно поступить с этим? или не знаю, даже если это возможно. Я хочу это в подходе с обратным порядком байтов. Также можно передать значения массива как одну переменную как unint8_t*, так как мне нужно отправить значение в функцию

Функция (uint8_t *результат);

Пример

uint32_t var1 = 1 2 3 4 5 6 7 8
uint32_t var2 = 9 A B C D E F 0

Результат

*uint8_t= 12 34 56 78 9A BC DE F0

Я попробовал этот подход, но не знаю, как его использовать с двумя переменными uint_32.

uint32_t value;
uint8_t *result[4];

result[0] = (value & 0x000000ff);
result[1] = (value & 0x0000ff00) >> 8;
result[2] = (value & 0x00ff0000) >> 16;
result[3] = (value & 0xff000000) >> 24;

func(uint8_t *result);

Я получаю *** обнаружение разрушения стека ***: завершено

result не должен быть массивом указателей, это должен быть массив uint8_t.
Barmar 21.11.2022 20:20

Похоже, вы можете захотеть скопировать значения или биты двух uint32_t объектов в массив uint8_t объектов, а не в один uint8_t. (uint32_t и uint8_t являются стандартными типами C; если вы работаете с чем-то, что определяет uint32 и uin8 или uint8, они, вероятно, эквивалентны, но, как правило, следует отдавать предпочтение стандартным типам.) Способ, в который биты из объектов uint32_t должны быть скопированы в массив uint8_t зависит от причин для этого. Например, одной из причин может быть подготовка данных для передачи по сети…

Eric Postpischil 21.11.2022 20:29

Для некоторых целей байты должны сначала попасть в «большой конец» массива (самые значащие байты). Для других целей может понадобиться родной порядок реализации C. В других контекстах, возможно, желательно какое-то чередование из-за происхождения значений uint32_t. Поэтому вам нужно отредактировать вопрос, чтобы предоставить полный контекст или спецификации для желаемых результатов.

Eric Postpischil 21.11.2022 20:30

Привет @EricPostpischil Я использую это для связи по сети контроллера, var1 и var2 - это старшие и младшие биты данных, мне нужно отправить их в мое приложение, которое получает как uint_8 *

user20156410 21.11.2022 20:52

Использует ли отправляющая система упорядочение байтов в целых числах с обратным порядком байтов или прямым порядком байтов? Ожидает ли принимающее приложение обратный порядок байтов или обратный порядок байтов?

Eric Postpischil 21.11.2022 20:57

@ user20156410 Вы хотели получить результат «12 34 56 78 9A BC DE F0», а не «12 34 56 98 9A BC DE F0», как было опубликовано?

chux - Reinstate Monica 21.11.2022 21:01

Размещенный код не будет приводить к выводу «*** обнаружено разрушение стека ***: завершено». Лучше всего опубликовать минимальный воспроизводимый пример.

chux - Reinstate Monica 21.11.2022 21:04
uint32_t var1 = 1 2 3 4 5 6 7 8 непонятно. Вы имели в виду uint32_t var1 = 0x12345678;?
chux - Reinstate Monica 21.11.2022 21:05
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
8
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная ошибка, которую вы получаете, связана с определением результирующего вектора как массива указателей, но с последующей записью их со значениями. это построено в куче. вам нужно определить массив uint_8 размера 4 или 8, в котором хранятся значения, соответствующие uint32_t.

Поскольку вы используете uC, они могут иметь разный порядок байтов для представления слов или данных (например, int32 , int64 и т. д.). поскольку вы привели пример, который вы ожидаете, и я запускаю код на LSB или ПК с прямым порядком байтов (x86, arm, 64 и т. д.), я должен проанализировать его следующим образом. но в UC, если это Big endian (сначала MSB), тогда анализируйте в обратном порядке.

#include<stdio.h>
#include<stdint.h>

uint32_t var1 = 0x12345678;
uint32_t var2 = 0x9ABCDEF0;


void to_uint8_t(uint32_t value, uint8_t* result){
    for(uint16_t i = 0; i< 4;i++)
        result[3 - i] = (value >> (i * 8))& 0xff; /* little endian*/
        // result[i] = (value >> (i * 8))& 0xff; /* big endian*/
}

int main(){
    uint8_t result[8];
    
    to_uint8_t(var1, result);
    to_uint8_t(var2, result + 4);
    
    for(uint16_t i =0; i< 8;i++)
       printf("%x ", result[i]);
    printf("\n");    
}

Вывод:

12 34 56 78 9a bc de f0 

Вы предоставили код для прямого и прямого порядка байтов. Если им нужен собственный порядок байтов, они могут просто использовать memcpy.

ikegami 21.11.2022 21:52

Ответы, содержащие только код, не рекомендуются — пожалуйста, объясните, что вы сделали.

M.M 21.11.2022 21:55

@ikegami это было для демонстрации того, как следовать оригинальному способу написания вопроса. наверняка в одном из них можно было заменить memcpy.

amirhm 21.11.2022 22:00

@M.M спасибо за отзыв, конечно, вы правы. Я в основном думал тогда, основываясь на вопросе, поскольку он имеет минимальные изменения, за которыми можно легко следить, однако я добавлю описание

amirhm 21.11.2022 22:01

Re «наверняка в одном из них можно заменить memcpy», это не будет эквивалентно, нет, если вы не пожертвуете переносимостью. Существует три порядка следования байтов: родной, с прямым порядком байтов и с прямым порядком байтов. memcpy будет производить нативные. Вы предоставили способ получить два других.

ikegami 21.11.2022 22:17

Интересно, а почему uint16_t в for(uint16_t i =0; i< 8;i++)?

chux - Reinstate Monica 21.11.2022 23:51

@ikegami никаких конкретных причин, это только для печати и, вероятно, лучше использовать либо int, либо uint8_t, поскольку их всего 8, у вас есть конкретный комментарий или рекомендация?

amirhm 23.11.2022 21:59

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