Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для Luca Brasi
892 / 204 / 55
Регистрация: 06.11.2015
Сообщений: 2,288
Записей в блоге: 2

Разбиение числа на байты и запись в массив

18.07.2023, 17:19. Показов 4947. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени!
Простого решения найти не получается, поэтому чтобы было интуитивно понятно - хотел бы посоветоваться.
Нужно собрать массив байт, в котором под каждый параметр выделен соответствующий диапазон байт.
Т.е., например для параметра x1 - byte1 и byte2, а для x2 - byte3, byte4, byte5.
Пишется оно "справа на лево"

В идеале вижу это так, есть функция, в ней допустим передаются параметры x1,x2,x3,x4. Ну а она уже сама всё делает и выдает указатель на массив, например.
Но как поделить эти байты в числе? А тоу меня какая то слишком сложная логика.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.07.2023, 17:19
Ответы с готовыми решениями:

Разбиение вещественного числа на байты
Доброго времени суток! Требуется помощь начинающему =) Имеется число типа float, занимающее 4 байта. Для передачи этого числа по...

Разбиение большого числа и запись его в переменные
Необходимо разбить большое число на несколько чисел по 4 символа и присвоить переменным эти значения. Например Число - 12345678 ch1...

Разбиение введенного числа на цифры и занесение этих цифр в массив
Вывести элементы массива, разделяя их двумя пробелами.

34
 Аватар для Наталья8
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
23.07.2023, 04:18
Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
unsigned long long number = ULLONG_MAX;
    uint8_t num[20] = {};
    for (uint8_t* ptr = (uint8_t*)&number + 8; ptr > (uint8_t*)&number; --ptr){
        num[((uint8_t*)&number + 8) - ptr] = *(ptr);
    }
Если надо с конца.

Добавлено через 1 час 20 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdint.h>
#include <limits.h>
 
int _tmain(int argc, _TCHAR* argv[])// 18446744073709551615
{
    unsigned long long number = 18446744073709551614;// <--- На циферку меньше... ULLONG_MAX
    uint8_t num[20] = {}, *ptr = NULL;
    for (ptr = (uint8_t*)&number + 7; ptr >= (uint8_t*)&number; --ptr)
        num[((uint8_t*)&number + 7) - ptr] = *(ptr);
    ptr = &num[0];
    while (ptr < num + 8) printf("%X,  ", *ptr++);
getchar();// Так, или наоборот?
    return 0;
}
0
 Аватар для Наталья8
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
23.07.2023, 04:19
0
Эксперт .NET
 Аватар для Rius
13838 / 7880 / 1706
Регистрация: 25.05.2015
Сообщений: 23,922
Записей в блоге: 14
23.07.2023, 06:32
Вот тут ещё обсуждалось : Как получить из двух byte один int?
0
 Аватар для Наталья8
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
23.07.2023, 13:21
Это си... Любые капризы..
0
 Аватар для Наталья8
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
23.07.2023, 14:13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdint.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    const char hello[] = { "hello" };
                               int rezult = {};// int rezult с нулём.....
    uint8_t *ptr = NULL, i=0;
    for (ptr = (uint8_t*)&rezult;; ptr++){
/* Указатель uint8_t привязал к инту rezult. Пробегаю по инту и гоню туда буковки из массива char*/
        if (hello[i] == 'o')break;
        *ptr = hello[i]; //<---------- Вот строчка записи (Четыре буквы)
printf("%c --->%d, ", hello[i], hello[i]);
i++;
    }
printf("\n\nint rezult = %d", rezult);
 
    getchar();
    return 0;
}

И того четыре байта...
0
 Аватар для Наталья8
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
23.07.2023, 14:43
Вместе до кучи. Записываю в int , Читаю из него в массив.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const char hello[] = { "hello" };
                               int rezult = {};// int rezult с нулём.....
    uint8_t *ptr = NULL, i=0;
    for (ptr = (uint8_t*)&rezult;; ptr++){
/* Указатель uint8_t привязал к инту rezult. Пробегаю по инту и гоню туда буковки из массива char*/
        if (hello[i] == 'o')break;
        *ptr = hello[i]; //<---------- Вот строчка записи (Четыре буквы)
printf("%c --->%d, ", hello[i], hello[i]); i++;
    }
printf("\n\nint rezult = %d\n\n", rezult);
printf("%s", "read from int\n\n");
 
// ========================================= Читаю int в массив... read from int
unsigned int number = rezult;
uint8_t num[10] = {};// <------------- Пустoй массив int
for (ptr = (uint8_t*)&number + 3; ptr >= (uint8_t*)&number; --ptr)
num[((uint8_t*)&number + 3) - ptr] = *(ptr);
 
// ----------------------- Показываю
ptr = &num[0];
while (ptr < num + 4){
    printf("%d --%c,  ", *ptr, *ptr);
    ptr++;
}
getchar();
0
 Аватар для Наталья8
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
23.07.2023, 23:42
Цитата Сообщение от Rius Посмотреть сообщение
Вот тут ещё обсуждалось : Как получить из двух byte один int?
Ну уж простите. Я не такой умный MISRA-C:2004 не читал...

Добавлено через 1 минуту
Может было бы проще использовать memcpy(....

Добавлено через 3 часа 54 минуты
Ничего гонять то не надо

C++
1
2
3
4
5
6
7
8
9
10
int _tmain(int argc, _TCHAR* argv[])
{
    const char hello[] = { "hello" };
    int *ptr = (int*)&hello[0];// Просто указатель на int привязали к массиву char,
    //  и разименовав его, получаем int
    int res = *ptr;
        printf(" int = %d", res);
        getchar();
        return 0;
}
0
 Аватар для Наталья8
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
23.07.2023, 23:44
Название: NewPicture15.png
Просмотров: 77

Размер: 9.6 Кб
0
 Аватар для Наталья8
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
23.07.2023, 23:55
И наоборот...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int _tmain(int argc, _TCHAR* argv[])
{
    const char hello[] = { "hello" };
    int *ptr = (int*)&hello[0];// Просто указатель на int привязали к массивы char,
    //  и разименовав его, получаем int
    int res = *ptr;
                                     printf(" int = %d", res);
        char *next_hello = (char*)&res;// Поступаем аналогично наоборот.
        *(next_hello + 4) = '\0';
                                     printf("\n char = %s", next_hello);
    getchar();
        return 0;
}
Название: NewPicture15 (2).png
Просмотров: 73

Размер: 7.0 Кб
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
24.07.2023, 01:26
Наталья8, можно проще:
C
1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main(void) {
    unsigned long long hell = 1280066888ULL;
    printf("%s\n", (char*)&hell);
 
    return 0;
}
Code
1
2
3
4
[andrew@centandrew other]$ gcc -Wall hell.c
[andrew@centandrew other]$ ./a.out 
HELL
[andrew@centandrew other]$
1
фрилансер
 Аватар для Алексей1153
6501 / 5737 / 1134
Регистрация: 11.10.2019
Сообщений: 15,376
24.07.2023, 08:25
easybudda, или так (правда, с предупреждением от компилятора)

C
1
unsigned long long hell = '\0LLEH';
0
 Аватар для Наталья8
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
24.07.2023, 13:09
Зачем предупреждение. Нормальная такая ошибка.

Что то надо написать. А то реально мало букофф.
0
 Аватар для Наталья8
629 / 387 / 67
Регистрация: 09.03.2016
Сообщений: 4,310
24.07.2023, 13:27
easybudda,
Работает.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
24.07.2023, 13:43
Цитата Сообщение от Алексей1153 Посмотреть сообщение
правда, с предупреждением от компилятора
Ну это и выглядит как-то не кошерно, и не факт, что соберётся (смотря, чем собирать)... Да и с циферками интереснее как-то.
0
24.07.2023, 15:21

Не по теме:

Чем я люблю visual studio. Сразу ошибки подчёркивает.
Не надо компилировать.
Вспомнил указатели и слава богу.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2023, 15:21

Разбиение введенного числа на цифры и занесение этих цифр в массив
3.***Написать программу, которая осуществляет разбиение введенного числа на цифры и заносит эти цифры в массив. Вывести элементы массива,...

Чтение из текстового файла и запись в массив. Разбиение массива строк на 4 массива. Split
Необходимо считать данные из файла в 4 массива. внутри файла текст такого типа ...

ByteConverter и запись в файл. Нарушаются байты
Добрый день! Проблема такая: Есть массив Byte bytes; Он инициализируется с помощью функции CreateSignature...

Binary запись чтение. Сохранить байты в бинарный файл и считать их
Доброго времени суток господа Помогите разобраться со структурой бинарного файла Есть структура byte imageData =...

Запись числа в массив
Здравствуйте! Не могу осуществить запись числа в массив в отдельной функции. Допустим, в функцию передалось число 213. Функция вернула...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru