Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/69: Рейтинг темы: голосов - 69, средняя оценка - 4.64
 Аватар для prosto_lynx
49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227

Как массив char[4] перевести в unsigned int?

06.04.2012, 21:33. Показов 15417. Ответов 57
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть массив из 4х char символов (4-е байта), нужно его перевести в unsigned int.
Я сделал втупую:
C++
1
2
3
4
5
6
7
        unsigned int B=0;
        long Ex = 256 * 256 * 256;
        for (int i=0; i<4; i++)
        {
                B8 += t[i] * Ex;
                Ex /= 256;
         }
Можно ли это как-то упростить?.. а то уж слишком некрасиво, долго и программу засоряет...

Я мыслю так, т.к. обе переменные (и 4-е char'a, и int) 4-х байтовые, то появилось предположение, что можно, как-нибудь, например, обратиться к char-массиву, сразу записав его в переменную int не преобразовывая?..
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.04.2012, 21:33
Ответы с готовыми решениями:

Перевести long long unsigned int в массив char
Подскажите, пожалуйста, как превратить число типа long long unsigned int в массив символов? Каждый символ - цифра числа в 16-значной...

Надо перевести переменную типа unsigned char* в signed int и обратно
у меня есть переменная типа unsigned char*, мне нужно перевести ее в signed int , провести арифметические вычисления и затем перевести ее...

Как перевести массив int в массив char
Как перевести массив int в массив char нужна помощь

57
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
14.06.2017, 11:38
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от bugaboo Посмотреть сообщение
а практическая разница какая-то есть?
есть. https://habrahabr.ru/post/106294/
C-style cast по сути самое медленное преобразование, так как в этом случае последовательно перебираются следующие вызовы:
const_cast
static_cast
static_cast + const_cast
reinterpret_cast
reinterpret_cast + const_cast
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.06.2017, 11:47
Цитата Сообщение от TRam_ Посмотреть сообщение
C-style cast по сути самое медленное преобразование, так как в этом случае последовательно перебираются следующие вызовы
выбор каста осуществляется времени компиляции,
если что.

времени выполнения никаких преобразований
уже не происходит.
нет никаких накладных расходов.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.06.2017, 13:33
Ой-ой. Яркий пример того, как автор сел писать статью, еще не до конца разобравшись в вопросе. Порочная практика, по моему мнению.

Цитата Сообщение от bugaboo
а практическая разница какая-то есть?
Практическая разница в том, что С-style cast плохо видно в коде (его трудно искать автоматическими средствами), а его универсальность плохо способствует отражению намерений программиста: из кода не понятно, что мы в итоге делаем за преобразование; и такое преобразование "все-в-одном" может стать причиной сокрытия ошибки. Например, мы можем с легкой руки случайно снять константность с объекта и получить UB на его последующей модификации. И компилятор нам тут ничем не поможет.

Ну и есть еще несколько маленьких нюансов (надеюсь они никогда никому не понадобятся).
C-style cast позволяет сделать корректное static_cast преобразование в пределах иерархии классов с закрытым или защищенным (protected/private) наследованием в точке, где член иерархии недоступен (inaccessible), чего обычный static_cast сделать не позволит (т.к. он смотрит на access rights - и это хорошо, чем более строгий контроль, тем проще сохранить корректность программы).
5.4/4
The same semantic restrictions and behaviors apply, with the exception that in performing a static_cast
in the following situations the conversion is valid even if the base class is inaccessible.
Кроме того, имеет место ситуация с поведением в случае каста неполных типов. Если оба или один из типов (тип к которому приводят и приводимый тип) являются классовыми неполными типами, то не определено какой из кастов в итоге будет применен: static_cast или reinterpret_cast, даже если типы связаны отношением наследования.
5.4/5
The destination type of a cast using the cast notation can be “pointer to incomplete class type”. If both the
operand and destination types are class types and one or both are incomplete, it is unspecified whether the
static_cast or the reinterpret_cast interpretation is used
, even if there is an inheritance relationship
between the two classes.
7
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.06.2017, 13:43
Цитата Сообщение от DrOffset Посмотреть сообщение
Кроме того, имеет место ситуация с поведением в случае каста неполных типов. Если оба или один из типов (тип к которому приводят и приводимый тип) являются классовыми неполными типами, то не определено какой из кастов в итоге будет применен: static_cast или reinterpret_cast, даже если типы связаны отношением наследования.
не понятно.
reinterpret_cast можно применять только указателям или ссылкам жеж.
которые всегда являются полными типами.

static_cast в принципе не получится применить к неполному типу.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.06.2017, 13:48
Цитата Сообщение от hoggy Посмотреть сообщение
не понятно.
Ну там речь про указатели и ведется Про указатели на неполные типы.
Да, я поторопился и не сказал об этом явно.

Добавлено через 1 минуту
Но в цитате это есть:
The destination type of a cast using the cast notation can be “pointer to incomplete class type”
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
14.06.2017, 14:28
Цитата Сообщение от bugaboo Посмотреть сообщение
Evg, тогда, наверно, такой вариант будет универсальным?
C++
1
2
3
4
5
6
        unsigned char buf[4];
        unsigned int x = 0;
        for (int i = 0; i < 4; i++)
            buf[i] = ifs.get();
        for (int i = 0; i < 4; i++)
            x += buf[3 - i] << (i << 3);
байты считываются заведомо как положительные числа в определенном порядке(файл заведомо big-endian, открыт как бинарный), а х вычисляется как сумма, то есть его представление в памяти не важно. У меня работает ))
Да что ты привязался к положительным и отрицательным числам. Они практически никакой роли не играют. Endian влияет на ПОРЯДОК, в котором надо извлекать байты из потока (или записывать в результирующую переменную). Универсальность кроме обеспечения правильного порядка больше ни от чего не зависит

Варианты из постов #16 и #17 точно так же никакого отношения к универсально работающему коду не имеют. Поскольку всегда читают и пишут в одном и том же порядке, а значит будут работать только на каком-то конкретном endian'е
0
 Аватар для bugaboo
-1 / 4 / 0
Регистрация: 12.06.2017
Сообщений: 60
18.06.2017, 22:42
Evg, то есть, на что конкретно будет влиять endian? на операции побитового сдвига влево, или на int, вычисляемый в виде суммы? Слово "отрицательные" я беру в кавычки, чтобы не писать "байты, у которых первый бит установлен в 1"
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
18.06.2017, 22:47
Цитата Сообщение от bugaboo Посмотреть сообщение
на что конкретно будет влиять endian?
На порядок байт в числе.
https://ru.wikipedia.org/wiki/... 0%BE%D0%B2
0
 Аватар для bugaboo
-1 / 4 / 0
Регистрация: 12.06.2017
Сообщений: 60
18.06.2017, 23:09
Цитата Сообщение от Croessmah Посмотреть сообщение
На порядок байт в числе.
А какое он для меня имеет значение то? Я же это число вычисляю как сумму, а не из байтов скрещиваю... простите, это, видимо, выше моего понимания...

Добавлено через 9 минут
сейчас у меня примерно вот такой код
C++
1
2
3
4
5
6
7
8
9
template <typename T> void readx(T& x, ifstream& ifs)
{
    char c;
    for (__int8 i = sizeof(T) - 1; i >= 0; i--)
    {
        if (!(ifs.get(c))) throw frex(ifs.rdstate(), "header length", x);
        x += static_cast<T>(c) << (i << 3);
    }
}
что тут может не срастись?
или на big endian 2+2 # 4?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
18.06.2017, 23:34
Я же это число вычисляю как сумму, а не из байтов скрещиваю...
Но эту сумму ты ж где-то будешь использовать? И массив с байтами у тебя тоже не "абстрактно откуда взялся", а вроде как из MIDI-файла.

Если речь об 32-битном беззнаковом числе, то при ошибке пересчёта endian'ов 2+2 = 67108864 . Потому что 2ка распознается как 33554432 .
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
18.06.2017, 23:37
Цитата Сообщение от bugaboo Посмотреть сообщение
А какое он для меня имеет значение то? Я же это число вычисляю как сумму, а не из байтов скрещиваю
Что-то у меня (а может и не только) было какое-то помутнение разума. Просто тема endian'ов уже для форума настолько избитая, что в голове всё перемешалось и я немного позабыл про твою исходную постановку задачи

Действительно, вариант из поста #17 почти правильный, только нужно результат ifs.get() преобразовать к типу unsigned char (см. пост #10, просто в нём замени or на plus). Т.е. твой вариант НЕ будет зависеть от endian'а и всегда будет работать правильно. Но твой изначальный вариант вопрос о том, как бы это сделать попроще (т.е. тупо скопировав 4 байта без свистоплясок) он не решается из-за того, что есть разные endian'ы. Точнее, решается, но только с учётом enidan'а, что делает решение более громоздким, чем твоё

Прошу прощения, что внёс смуту

Добавлено через 2 минуты
TRam_, если в файле записано 0x11223344, то он прочитает это как 0x11<<24 + 0x22<<16 + 0x33<<8 + 0x44. Т.е. в host-представлении получится число, которое в big-endian лежит в памяти как 0x11223344. Т.е. то, что изначально требовалось
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
18.06.2017, 23:37
2 * 2^(8*3)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
18.06.2017, 23:39
Т.е. в файле записано ПРЕДСТАВЛЕНИЕ, а в результате вычислений получается ЗНАЧЕНИЕ, соответствующее big-endian представлению

Добавлено через 54 секунды
Цитата Сообщение от TRam_ Посмотреть сообщение
2 * 2^(8*3)
Что-то тут ты явно намудрил
0
 Аватар для bugaboo
-1 / 4 / 0
Регистрация: 12.06.2017
Сообщений: 60
18.06.2017, 23:47
Evg, наверно, путаница от того, что я не автор темы, а просто озаботился тем же вопросом и тему развил. Под словом "попроще" я имел в виду покороче, поизящнее код. И вроде бы, этот код родился.
Спасибо всем большое!
TRam_, эту сумму я запишу куда то в класс, буду преобразовывать и на выходе у меня будет совсем другое MIDI. Так что порядок байт не важен. Возможно, возникнут проблемы подобного рода на выходе, но в стандарте SMF, к счастью, стабильный big-endian
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
18.06.2017, 23:50
Evg, это сдвиг на 3 байта влево. В случае если у нас ошибочное определение endian, то младший байт становится старшим, т.е. смещается на 3 байта влево. Но написал да, в неочевидном виде.

Добавлено через 2 минуты
bugaboo, вот я и говорю, что если портируешь свой код на машину с big endian'овым процессором, то обрабатываться будет неправильно. Если там у тебя просто копипаста этого значения, то к чему его хранить в int, когда можно в char[4] ?
0
 Аватар для bugaboo
-1 / 4 / 0
Регистрация: 12.06.2017
Сообщений: 60
18.06.2017, 23:52
TRam_, не могу дать крутую ссылку, но вот какая то статья
http://learnc.info/c/bitwise_operators.html
там написано, что для операций сдвига endian не имеет значения
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
18.06.2017, 23:56
bugaboo, но имеет значение для тех чисел, которые у тебя константы и/или локальные переменные, которые участвуют в вычислениях (например складываются с таким преобразованным числом, или производятся побитовые операции с ним и теми константами/переменными).
0
 Аватар для bugaboo
-1 / 4 / 0
Регистрация: 12.06.2017
Сообщений: 60
18.06.2017, 23:56
TRam_, мой конкретный случай такой, что обработка не будет носить характер работы с памятью. но то что нужно учитывать порядок endian я уже вкурил на всю жизнь ))
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
19.06.2017, 10:09
Цитата Сообщение от bugaboo Посмотреть сообщение
Evg, наверно, путаница от того, что я не автор темы
Тьфу ты, точно. Короче, ты свой вопрос решил?

Цитата Сообщение от TRam_ Посмотреть сообщение
Evg, это сдвиг на 3 байта влево. В случае если у нас ошибочное определение endian, то младший байт становится старшим
По-моему ты путаешь представление и значение. Операции сдвига выполняются над значением. Задача стоит в том, чтобы прочитать (вычислить) именно значение. У него делается это правильно
0
Заблокирован
20.06.2017, 23:09
hoggy, то, что ответ с UB признан одним из лучших, по-моему недвусмысленно характеризует обитателей сего форума. Не так ли?

Добавлено через 4 минуты
Цитата Сообщение от TRam_ Посмотреть сообщение
есть. https://habrahabr.ru/post/106294/
C-style cast по сути самое медленное преобразование, так как в этом случае последовательно перебираются следующие вызовы:
const_cast
static_cast
static_cast + const_cast
reinterpret_cast
reinterpret_cast + const_cast
Ха-ха-ха-ха! Писатель сей чуши думает, что что-то последовательно перебирается в рантайме?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.06.2017, 23:09

Сделать преобразование unsigned char в char, а затем типу int
Здраствуйте, есть вопрос: Число представлено двумя полями: типа long для рублей и unsigned char - для копеек. Собственно что мне...

Перевести биты int в unsigned int
Доброго времени суток, как можно получить из int -&gt; unsigned int, т.е. где все биты в таком же порядке, по идее тогда будет без минуса. ...

Vector<unsigned char> в int
есть vector&lt;unsigned char&gt; размером 4 байта..и мне надо перевести их в 1 число типа int. т.е. типо int command = tempN.data(); но ...

Перевести Int в unsigned char в формате hex
Приветствую всех. Что-то тупняки с утра дикие, помогите пожалуйста сообразить как правильно сделать: Есть у меня пакет с данными...

Как перевести сишный unsigned int в явский int?
Кто-нибудь занимался подобным переводом кода? Поначалу я думал, что разницы вообще нет, просто есть знаковое представление и слегка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru