Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 14.10.2014
Сообщений: 57

Как преобразовать массив байт (16) в 4 uint

17.04.2019, 16:35. Показов 3287. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Как быстро (и просто) преобразовать массив байт в 4 беззнаковых 32-битных числа?

Т.е.

C#
1
2
3
4
5
byte[] byteArray = new byte[] {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16};
uint1 = ? // должно быть со swap-ом 0x01020304 -> 0x04030201
uint2 = ?
uint3 = ?
uint4 = ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.04.2019, 16:35
Ответы с готовыми решениями:

Как без использования циклов перевести IList<uint> в uint[]
Добрый день! Не подскажите, как без использования циклов перевести IList&lt;uint&gt; в uint. К примеру, в List&lt;uint&gt; есть метод...

Преобразовать число в массив байт
Приветствую уважаемые форумчане, есть задача преобразовать целое число с максимальным значением 16777215 или в HEX = FFFFFF. Число...

Преобразовать экземпляр структуры в массив байт
Народ, передо мной стоит задача: преобразовать экземпляр структуры, одним из полей которых является объект Hashtable, то есть reference...

12
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
17.04.2019, 16:47
Лучший ответ Сообщение было отмечено RedScorpio как решение

Решение

C#
1
2
3
4
uint1 = BitConverter.ToUInt32(byteArray, 0);
uint2 = BitConverter.ToUInt32(byteArray, 4);
uint3 = BitConverter.ToUInt32(byteArray, 8);
uint4 = BitConverter.ToUInt32(byteArray, 12);
2
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
17.04.2019, 16:58
C#
1
2
3
4
            byte[] byteArray = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
            uint[] ia = new uint[4]; // должно быть со swap-ом 0x01020304 -> 0x04030201
            for (int i = 0; i < ia.Length; i++)
                ia[i] = BitConverter.ToUInt32(byteArray, i * 4);
C#
1
2
3
4
            uint i1 = Unsafe.As<byte, uint>(ref byteArray[0]);
            uint i2 = Unsafe.As<byte, uint>(ref byteArray[4]);
            uint i3 = Unsafe.As<byte, uint>(ref byteArray[8]);
            uint i4 = Unsafe.As<byte, uint>(ref byteArray[12]);
C#
1
2
3
4
5
6
7
8
9
10
            unsafe
            {
                fixed (byte* ptr = byteArray)
                {
                    uint i1 = *(uint*)(ptr + 0);
                    uint i2 = *(uint*)(ptr + 4);
                    uint i3 = *(uint*)(ptr + 8);
                    uint i4 = *(uint*)(ptr + 12);
                }
            }
2
0 / 0 / 0
Регистрация: 14.10.2014
Сообщений: 57
17.04.2019, 17:15  [ТС]
Всем спасибо
Использовал код kolorotur, только добавил swap (вынес в отдельную функцию - пригодится)

C#
1
2
3
4
        public static uint SwapUINT(uint x) {
            x = (x >> 16) | (x << 16);
            return ((x & 0xFF00FF00) >> 8) | ((x & 0x00FF00FF) << 8);
        }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
17.04.2019, 17:19
Цитата Сообщение от RedScorpio Посмотреть сообщение
добавил swap
А нужен ли он там?
Цитата Сообщение от RedScorpio Посмотреть сообщение
// должно быть со swap-ом 0x01020304 -> 0x04030201
У вас и будет на выходе 0x04030201, если система Little-Endian.
0
0 / 0 / 0
Регистрация: 14.10.2014
Сообщений: 57
17.04.2019, 17:23  [ТС]
нужен
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
17.04.2019, 17:27
Цитата Сообщение от RedScorpio Посмотреть сообщение
нужен
C#
1
2
3
byte[] byteArray = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
var uint1 = BitConverter.ToUInt32(byteArray);
Console.WriteLine($"{uint1:X}"); // 4030201
Выводит как вам нужно было, нет?
0
0 / 0 / 0
Регистрация: 14.10.2014
Сообщений: 57
17.04.2019, 17:42  [ТС]
У меня не консольная утилита, со swap работает именно так, как мне нужно. Т.е. использую

C#
1
2
3
4
uint1 = Utils.SwapUINT(BitConverter.ToUInt32(byteArray, 0));
uint2 = Utils.SwapUINT(BitConverter.ToUInt32(byteArray, 4));
uint3 = Utils.SwapUINT(BitConverter.ToUInt32(byteArray, 8));
uint4 = Utils.SwapUINT(BitConverter.ToUInt32(byteArray, 12));
Код Utils.SwapUINT() выше
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
17.04.2019, 18:00
Цитата Сообщение от RedScorpio Посмотреть сообщение
У меня не консольная утилита
Ну MessageBox вместо Console.WriteLine

Цитата Сообщение от RedScorpio Посмотреть сообщение
со swap работает именно так, как мне нужно
Да я не спорю, просто в первом сообщении вы написали:
Цитата Сообщение от RedScorpio Посмотреть сообщение
должно быть со swap-ом 0x01020304 -> 0x04030201
Я так понял после стрелочки — это то, что вам нужно на выходе.
Без свапа на little-endian системах на выходе будет то, что справа от стрелочки, а со свапом — то, что слева от стрелочки.
На big-endian системах будет наоборот.
0
0 / 0 / 0
Регистрация: 14.10.2014
Сообщений: 57
18.04.2019, 13:11  [ТС]
Я приношу извинения... Но как сделать обратное преобразование (так же изящно)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.04.2019, 14:17
Цитата Сообщение от RedScorpio Посмотреть сообщение
как сделать обратное преобразование (так же изящно)
Изящнее всего, пожалуй, будет через небезопасный контекст:

C#
1
2
3
4
5
6
7
8
fixed (byte* pBase = byteArray)
{
    uint* ptr = (uint*)pBase;
    *ptr++ = uint1;
    *ptr++ = uint2;
    *ptr++ = uint3;
    *ptr++ = uint4;
}
Добавлено через 1 минуту
Можно сократить до двух операций:
C#
1
2
3
4
5
6
fixed (byte* pBase = byteArray)
{
    ulong* ptr = (ulong*)pBase;
    *ptr++ = (ulong)uint2 << 32 | uint1;
    *ptr++ = (ulong)uint4 << 32 | uint3;
}
1
0 / 0 / 0
Регистрация: 14.10.2014
Сообщений: 57
18.04.2019, 15:00  [ТС]
Спасибо
Сделал так

C#
1
2
3
4
            BitConverter.GetBytes(Utils.SwapUINT(uint1)).CopyTo(byteArray, 0);
            BitConverter.GetBytes(Utils.SwapUINT(uint2)).CopyTo(byteArray, 4);
            BitConverter.GetBytes(Utils.SwapUINT(uint3)).CopyTo(byteArray, 8);
            BitConverter.GetBytes(Utils.SwapUINT(uint4)).CopyTo(byteArrayr, 12);
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.04.2019, 15:12
Цитата Сообщение от RedScorpio Посмотреть сообщение
Сделал так
Пойдет, но если код выполняется очень часто, то будет много мусора и как следствие — тормоза.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.04.2019, 15:12
Помогаю со студенческими работами здесь

Преобразовать массив байт в десятичное число
Здравствуйте, товарищи! Есть массив байт byte bytes = { 48, 51, 48, 48 }; где элементы массива представляют собой символы Unicode,...

Преобразовать картинку в массив байт и обратно
Здравствуйте. Пожалуйста, объясните, как можно картинку преобразовать в набор байтов и обратно с примерами. Просто стоит задание, по...

Как заполнить массив (char и uint)
Надо заполнить массив char и uint . Десятичными цифрами рандомно. Как это сделать? Или заполнить uint массив а потом перевести его в...

Как произвольный байт на входе преобразовать в биты
Собственно, вопрос в заголовке )) Подскажите, пожалуйста! ))

Число uint разбить на 8 элементов по 4 бита, преобразовать каждый элемент в 16-ричное число
Не могу решить следующую задачу: Есть некоторое число uint (32-bit), его необходимо разбить на 8 элементов по 4 бита, преобразовать...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru