|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
20.05.2016, 01:39 | #1 |
Пользователь
Регистрация: 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. Или есть более изящный способ решить вопрос. |
20.05.2016, 02:09 | #2 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
вот есть 1 литровая банка, и 3х литровая.
я так понимаю, что в 1 литровую банку залить все 3 литра не получится. собственно вопрос: как мне быть? может разлить 3х литровую банку по 3м 1литровым? |
20.05.2016, 02:25 | #3 | |
Пользователь
Регистрация: 22.05.2013
Сообщений: 21
|
Цитата:
Не мешай пожалуйста, не забивай тему. |
|
20.05.2016, 06:28 | #4 | |||
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Цитата:
Цитата:
Цитата:
|
|||
21.05.2016, 16:16 | #5 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
|
21.05.2016, 16:19 | #6 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
он либо теряет данные, впихивая невпихуемое. либо не теряет, впихивая большое на несколько маленьких. при этом сама постановка задачи - бред. |
|
21.05.2016, 16:42 | #7 | |
Регистрация: 20.05.2016
Сообщений: 8
|
Цитата:
У тебя uint8_t, то бишь самый младший бит не используется как минус, но как и число и поместится максимум 0xFF, то бишь 255 может поможет. Мне довелось писать под свои нужды парсинг .manifest файлов сервиса Steam-а это файлы протобуфера (Protocol Buffer) и там используется преобразования числа берётся само значение числа и записывается в виде цепочки байт. Ну на вскидку 127 займёт 1 байт а 300 - 2 байта 100000 например 3 и все эти преобразованные цепочки можно записать друг за другом в одном файле. Таким макаром может быть достигнута более плотная форма записи (зависит от самих значений), чем например в массиве фиксированных uint32_t вот тебе макросы на преобразование в varint (так называется этот тип) и обратно Код:
Последний раз редактировалось wowks; 21.05.2016 в 16:55. |
|
21.05.2016, 17:46 | #8 | ||
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Цитата:
Цитата:
Последний раз редактировалось p51x; 21.05.2016 в 21:56. |
||
21.05.2016, 21:32 | #9 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Код:
|
22.05.2016, 02:27 | #10 |
Пользователь
Регистрация: 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 побайтно и на ПК соответственно воссоединить. Вот как то так. Надеюсь, я понятно изложил свои мысли. Думается мне можно как то и покрасивее? Буду рад если кто подскажет. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Машина Поста (Если количество меток в массиве кратно трем, то стереть метки в этом массиве через одну, иначе стереть весь массив) | 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 |