Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2016, 01:39   #1
dima040891
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 21
По умолчанию Преобразование Uint32_t в Uint8_t в массиве.

В процессе работы с массивами C/C++ возник следующий вопрос:

К примеру я создаю два массива:
Uint32_t [64] long;
Uint8_t [64] short;

long[0] = 125;
short[0] = long[0];
В массиве short с индексом 0 будет записано число 125, всё правильно.
Если же я напишу:
long[0] = 300;
short[0] = long[0];

В short[0] 300 записано уже не будет, как я понимаю максимально что там правильно запишется это число не более 127.
Собственно вопрос как мне быть?
Каким-то образом в short побайтно закидывать long? Если да то как это сделать. Т.е. как мне добраться до второго третьего и четвёртого байта и т.д. (не индекса!) массива long.
Или есть более изящный способ решить вопрос.
dima040891 вне форума Ответить с цитированием
Старый 20.05.2016, 02:09   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

вот есть 1 литровая банка, и 3х литровая.
я так понимаю, что в 1 литровую банку залить все 3 литра не получится.
собственно вопрос: как мне быть?
может разлить 3х литровую банку по 3м 1литровым?
_Bers вне форума Ответить с цитированием
Старый 20.05.2016, 02:25   #3
dima040891
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 21
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
вот есть 1 литровая банка, и 3х литровая.
я так понимаю, что в 1 литровую банку залить все 3 литра не получится.
собственно вопрос: как мне быть?
может разлить 3х литровую банку по 3м 1литровым?
Какой ответ! Всё что смог? Простенькая метафора на уровне 9 класса!
Не мешай пожалуйста, не забивай тему.
dima040891 вне форума Ответить с цитированием
Старый 20.05.2016, 06:28   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
как я понимаю максимально что там правильно запишется это число не более 127.
Не правильно, у вас UINT8

Цитата:
Каким-то образом в short побайтно закидывать long?
Ну все зависит от задания, а то можно и прсотое приведение на лонг сделать и второй массив не нужен.

Цитата:
Т.е. как мне добраться до второго третьего и четвёртого байта и т.д. (не индекса!) массива long.
Изучить битовые операции. Начать с битового И и сдвигов.
p51x вне форума Ответить с цитированием
Старый 21.05.2016, 16:16   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от dima040891 Посмотреть сообщение
Какой ответ! Всё что смог? Простенькая метафора на уровне 9 класса!
Не мешай пожалуйста, не забивай тему.
вы не ответили на вопрос
_Bers вне форума Ответить с цитированием
Старый 21.05.2016, 16:19   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Не правильно, у вас UINT8
Ну все зависит от задания, а то можно и прсотое приведение на лонг сделать и второй массив не нужен.
Изучить битовые операции. Начать с битового И и сдвигов.
в данном случае биты не нужны.

он либо теряет данные, впихивая невпихуемое.
либо не теряет, впихивая большое на несколько маленьких.

при этом сама постановка задачи - бред.
_Bers вне форума Ответить с цитированием
Старый 21.05.2016, 16:42   #7
wowks
 
Аватар для wowks
 
Регистрация: 20.05.2016
Сообщений: 8
По умолчанию

Цитата:
Сообщение от dima040891 Посмотреть сообщение
В short[0] 300 записано уже не будет, как я понимаю максимально что там правильно запишется это число не более 127.
это как посмотреть.
У тебя uint8_t, то бишь самый младший бит не используется как минус, но как и число и поместится максимум 0xFF, то бишь 255


Цитата:
Сообщение от dima040891 Посмотреть сообщение
Каким-то образом в short побайтно закидывать long?
может поможет.
Мне довелось писать под свои нужды парсинг .manifest файлов сервиса Steam-а
это файлы протобуфера (Protocol Buffer) и там используется преобразования числа
берётся само значение числа и записывается в виде цепочки байт.
Ну на вскидку 127 займёт 1 байт а 300 - 2 байта 100000 например 3
и все эти преобразованные цепочки можно записать друг за другом в одном файле. Таким макаром может быть достигнута более плотная форма записи (зависит от самих значений), чем например в массиве фиксированных uint32_t
вот тебе макросы на преобразование в varint (так называется этот тип)
и обратно
Код:
#define ___int_to_varint(int_value, result_varint, result_varint_len) \
    result_varint_len = 0; \
    while (int_value >= 128) { \
        result_varint[result_varint_len] = (uint8_t) (128 + (int_value % 128)); \
        result_varint_len++; \
        int_value = int_value / 128; \
    } \
    result_varint[result_varint_len] = (uint8_t) (int_value % 128); \
    result_varint_len++; \


#define ___varint_to_int(varint, varint_len, result_int) \
    result_int = 0; \
    for (register uintptr_t x = (varint_len - 1); x >= 1; x--) { \
        result_int += (varint[x] - 1); \
        result_int *= 128; \
    } \
    result_int += varint[0]; \

#define ___get_varint_len(varint, result_len) \
    result_len = 0; \
    do { \
        result_len++; \
    } while (varint[result_len - 1] & 0x80); \
подробнее можешь прочитать тут https://developers.google.com/protoc.../docs/encoding

Последний раз редактировалось wowks; 21.05.2016 в 16:55.
wowks вне форума Ответить с цитированием
Старый 21.05.2016, 17:46   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
в данном случае биты не нужны.

он либо теряет данные, впихивая невпихуемое.
либо не теряет, впихивая большое на несколько маленьких.
Цитата:
Каким-то образом в short побайтно закидывать long? Если да то как это сделать. Т.е. как мне добраться до второго третьего и четвёртого байта и т.д. (не индекса!) массива long.
Как я понял, вопрос был о запихивании байтов лонга по байтно в байтовый массив.

Последний раз редактировалось p51x; 21.05.2016 в 21:56.
p51x вне форума Ответить с цитированием
Старый 21.05.2016, 21:32   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Код:
union
{
 ulong long_var;
 uchar char_var[sizeof(long_var)];
};
waleri вне форума Ответить с цитированием
Старый 22.05.2016, 02:27   #10
dima040891
Пользователь
 
Регистрация: 22.05.2013
Сообщений: 21
По умолчанию

Спасибо всем!

_Bers видимо я Вас изначально неправильно понял.


Вообще говоря, программа над которой я работаю предназначена для микроконтроллера STM32. Проводится измерение некоторого сигнала с помощью встроенного АЦП, значения каждого измерения записываются в массив типа uint16_t long. Само же измеренное значение занимает 12 бит. В конфигурации модуля АЦП задал выравнивание результата измерений влево. Т.е. в long одно измеренное значение занимает как раз 2 байта. На первое время мне достаточно значения первого байта, т.е. отбрасывая младшие 4 бита я уменьшаю количество передаваемых байт ценой ухудшения разрешающей способности по уровню (напряжению) сигнала с 1024 до 256 ступенек. Оставалось только понять, как из массива long брать данные не по индексу, а непосредственно по адресу каждого байта, вот что я хотел узнать. Я пока смог сделать только так:

int Sh;

for(int i=0; i<64; i++) //Перебирается весь массив для перезаписи в один байт из двух
{

Sh = BufADC[i];

if (Sh>255) // Если значние в АЦП меньше 255 не сдвигать
{
shortADC[i] =(Sh>>8); // Сдвиг вправо на 8 бит
}
else
{
shortADC[i] = Sh;//??????????????????????????????????? ????????????????????
}
}


Т.е. в каждой итерации цикла проверяется не вышел ли за пределы младший байт long[] с индексом i и если да то производится сдвиг на 8 бит вправо и в short уже попадают старшие 8 бит измеренного значения АЦП, если нет, то записывается младший байт из long.

Только так смог реализовать.

Далее данные отправляются на ПК через USB. Отправка данных производится специальной функцией которой надо указать на массив с данными типа uint8_t, поэтому то и встал вопрос как данные из uint16_t преобразовать в uint8_t. В будущем буду передавать long побайтно и на ПК соответственно воссоединить. Вот как то так. Надеюсь, я понятно изложил свои мысли.


Думается мне можно как то и покрасивее? Буду рад если кто подскажет.
dima040891 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Машина Поста (Если количество меток в массиве кратно трем, то стереть метки в этом массиве через одну, иначе стереть весь массив) ksesh Помощь студентам 0 21.03.2015 12:21
Преобразование часов в числа, а так же преобразование время PeMeHb Microsoft Office Excel 5 19.10.2014 17:04
В массиве поставить вначале все четные, а затем все нечетные цифры в массиве (Написать программу в коде делфи) Murfik97 Помощь студентам 4 26.11.2013 21:26
Преобразование в С++ Davlet M Помощь студентам 3 03.10.2009 14:30