|
49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227
|
||||||
Как массив char[4] перевести в unsigned int?06.04.2012, 21:33. Показов 14779. Ответов 57
Метки нет (Все метки)
Есть массив из 4х char символов (4-е байта), нужно его перевести в unsigned int.
Я сделал втупую:
Я мыслю так, т.к. обе переменные (и 4-е char'a, и int) 4-х байтовые, то появилось предположение, что можно, как-нибудь, например, обратиться к char-массиву, сразу записав его в переменную int не преобразовывая?..
0
|
||||||
| 06.04.2012, 21:33 | |
|
Ответы с готовыми решениями:
57
Надо перевести переменную типа unsigned char* в signed int и обратно Как перевести массив int в массив char |
|
238 / 229 / 58
Регистрация: 27.10.2011
Сообщений: 249
|
||||||
| 06.04.2012, 21:52 | ||||||
Сообщение было отмечено как решение
Решение
3
|
||||||
|
12 / 10 / 1
Регистрация: 04.04.2012
Сообщений: 29
|
|||||||||||
| 07.04.2012, 10:26 | |||||||||||
Сообщение было отмечено как решение
Решение
Sergey-K красиво!
И еще:
3
|
|||||||||||
|
|
|
| 07.04.2012, 12:56 | |
|
При этом надо понимать, что код из поста 2 и код с union'ом из поста 3 будут работать только на little-endian машинах. Код из поста 2 надёжно будет работать только на машинах, в которых разрешены невыровненные обращения в память. Intel'овские процессоры удовлетворяют обоим критериям, а потому для "домашнего" использования или для программы, которая будет работать исключительно на Intel'е это канает, но в общем случае - нет
2
|
|
|
49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227
|
||
| 09.04.2012, 11:52 [ТС] | ||
|
Я так понял, что little-endian используется не только на интеловских процессорах, а вообще на архитектуре 86? p.s. Тогда, правильно ли я понимаю, что код из поста 2 всегда будет работать, если прога запущена из-под XP? (Запуск эмулятора XP я не рассматриваю).
0
|
||
|
|
|||
| 09.04.2012, 12:40 | |||
|
1
|
|||
|
-1 / 4 / 0
Регистрация: 12.06.2017
Сообщений: 60
|
||||||
| 12.06.2017, 10:39 | ||||||
|
А можно расшифровку способа №1 в 3 посте? его эффективность зависит от процессора?
Добавлено через 3 часа 33 минуты По зрелом размышлении удалось на основе поста №3 сделать вот такую функцию
0
|
||||||
|
|
||
| 12.06.2017, 16:19 | ||
|
1
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||||||||||||||||
| 12.06.2017, 16:39 | ||||||||||||||||
|
bugaboo, более правильным подходом был бы
Если использовать побитовое "или" вместо "+", то преобразование signed/unsigned теряет смысл. Правда так можно только для данного случая (собираемые байты друг с другом не пересекаются), иначе будет ошибка. И по логике, если б небыло неяного преобразования из char в int, то в результате операции
Добавлено через 4 минуты А стандартный вариант - это всё же использование memcpy -
2
|
||||||||||||||||
|
|
|||
| 12.06.2017, 16:49 | |||
|
C #include <stdio.h> int main (void) { unsigned int x; char buffer1 = 255; x = 0xaa000000; x |= (buffer1 << 8); printf ("%x\n", x); x = 0xaa000000; x |= ((unsigned char)buffer1 << 8); printf ("%x\n", x); } Code $ gcc t.c $ ./a.out ffffff00 aa00ff00
1
|
|||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||||||||||
| 12.06.2017, 17:39 | |||||||||||
|
Evg, спасибо! Действительно неверно представлял себе поведение знаковых чисел при их преобразовании к типу с большим числом байтов. Так что или
0
|
|||||||||||
|
-1 / 4 / 0
Регистрация: 12.06.2017
Сообщений: 60
|
|
| 12.06.2017, 20:21 | |
|
Evg, я новичок и поэтому могу говорить только на уровне "у меня работает/не работает". Но хотелось бы, чтобы потом оно работало независимо от способа представления данных процессором. Суть у меня в том, что я читаю эти 4 charа из файла MIDI(функцией read), в котором всегда используется big-endian, и они из себя представляют беззнаковый int. Любой из этих байтов может запросто прочитаться как отрицательный (хотя в большинстве случаев таким не является, а является беззнаковым). Есть ли какой-то универсальный способ прочтения 4х байт в int из файла, чтобы результат преобразования был правильным, независимо от того, big-endian или little-endian схема используется в процессоре?
Я же не в космос улетаю, мне всего то надо 4 байта прочитать - откуда берутся такие сложности?
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||||||
| 12.06.2017, 21:33 | ||||||
|
bugaboo, сложность в том, что тут
1) идёт преобразование из одного байта в 4. То есть char был 1, а тут ещё три новых добавилось. Если использовать знаковый тип, то все биты новых байтов заполнятся 1цами в случае, если первый бит у него 1ца. Это в любом случае, что для big-endian, что для little-endian. Для большей производительности лучше сделать преобразование в unsigned типа указателя:
1
|
||||||
|
|
|||
| 12.06.2017, 22:06 | |||
|
Или, что тоже самое. Взять твой вариант из поста #7 и в зависимости от совпадающих или различающихся endian'ов прочитать байты в прямом или обратном порядке. Тут надо немного думать и экспериментировать, если честно, мне уже лениво под вечер Какой endian у машины, на которой происходит запуск, можно проверить в runtime: C unsigned int x = 0x11223344; char *p = (char*) &x; if (*p == 0x44) little endian; else big endian; Signed/Unsigned Signed/Unsigned Signed/Unsigned Тип char.Signed/unsigned.Отличие типов данных.
1
|
|||
|
-1 / 4 / 0
Регистрация: 12.06.2017
Сообщений: 60
|
||||||
| 14.06.2017, 02:13 | ||||||
|
Evg, тогда, наверно, такой вариант будет универсальным?
0
|
||||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||||||
| 14.06.2017, 03:00 | ||||||
|
bugaboo, этот вариант будет работать только на процессорах с little-endian. Но, с другой стороны, полученную на данном компиляторе программу запустить на процессоре с big-endian не удастся - до тех пор пока её специально не скомпилируешь. Вот в этом случае и придётся вспоминать, что "у меня ж там был цикл, в котором надо будет поменять порядок". Но если кросс-платформенность не ожидается, то почему б и нет.
istream::get() возвращает int - http://www.cplusplus.com/refer... tream/get/ - причём сам char там передаётся в беззнаковом виде, так что специально преобразовывать в unsigned char не потребуется (а вот в unsigned int надо). И цикл можно оптимизировать:
1
|
||||||
|
-1 / 4 / 0
Регистрация: 12.06.2017
Сообщений: 60
|
|||||||||||
| 14.06.2017, 06:08 | |||||||||||
|
TRam_, большое спасибо, наконец-то получился красивый маленький универсальный код! С getом я действительно сплоховал...
Именно из=за кросс-платформенности я так и упарываюсь. Последний вопрос - зачем нужен static cast? Почему не использовать приведение типа?
Добавлено через 1 час 3 минуты И даже вот так отлично работает:
0
|
|||||||||||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||||
| 14.06.2017, 06:44 | |||||
|
Добавлено через 3 минуты
1
|
|||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 14.06.2017, 07:11 | ||||||||
1
|
||||||||
|
-1 / 4 / 0
Регистрация: 12.06.2017
Сообщений: 60
|
||||
| 14.06.2017, 07:34 | ||||
|
0
|
||||
| 14.06.2017, 07:34 | |
|
Помогаю со студенческими работами здесь
20
Сделать преобразование unsigned char в char, а затем типу int Перевести биты int в unsigned int
Как перевести сишный unsigned int в явский int? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
в-строка - входное арифметическое выражение в инфиксной(обычной). . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|