Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4

Можно ли прочитать 3,5,6,7 байт?

11.10.2020, 23:09. Показов 3477. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Писали о том что это связано с железом поэтому нет таких типов данных, но с другой стороны информация хранится в битах и возникает вопрос можно ли прочитать нужное количество байт/бит в диапазоне минимального и максимального типа данных?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2020, 23:09
Ответы с готовыми решениями:

А можно сделать так (разбить как нибудь или запятые вставить ), чтобы было не 8998989 байт, а 8,998,989 байт ?
Кстати, вот еще вопрос... В переменной (например, filesize) хранится размер файла. При выводе на печать <%=filesize%> выводится...

Прочитать 8 байт из файла
Прочитать 8 байт из файла , начиная с байта 5, и вывести их на экран. Пишу : procedure TForm1.N2241Click(Sender: TObject); var...

Прочитать несколько байт с сокета
Здравствуйте, уважаемые форумчане. Вопрос у меня следующий. reader::reader(QObject *parent) : QObject(parent) { socket =...

62
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
14.10.2020, 12:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от AlexVRud Посмотреть сообщение
C++ возможно всё
это понятно, что C++ может всё.
но мне не код нужен, а пример 3-х байтового числа.
всё что я сейчас вижу в этой теме это как пытаются взять 3 байта данных и обернуть всё это в какой-либо тип.
0
фрилансер
 Аватар для Алексей1153
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
14.10.2020, 12:26
Цитата Сообщение от _lunar_ Посмотреть сообщение
пример 3-х байтового числа.
0x112233;
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
14.10.2020, 12:30
Цитата Сообщение от _lunar_ Посмотреть сообщение
всё что я сейчас вижу в этой теме это как пытаются взять 3 байта данных и обернуть всё это в какой-либо тип.
Если нечто выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка.

Так что прочему boost::endian::big_int24_t это не трёхбайтовое число?
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
14.10.2020, 12:39
Цитата Сообщение от AlexVRud Посмотреть сообщение
это не трёхбайтовое число?
понятия не имею, с boost не работаю.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
0x112233;
о чём я и говорю - 3 байта данных (в структуре).
спрошу проще - почему число 1122867 является 3-х байтовым?
0
фрилансер
 Аватар для Алексей1153
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
14.10.2020, 13:04
Цитата Сообщение от _lunar_ Посмотреть сообщение
почему число 1122867 является 3-х байтовым
потому что для его хранения достаточно трёх байтов
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
14.10.2020, 13:14
Цитата Сообщение от _lunar_ Посмотреть сообщение
понятия не имею, с boost не работаю.
boost/не boost. Не важно. Создать тип, который будет работать с тремя байтами в памяти как с числом не сложно.
Вот программа:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <array>
#include <iostream>
 
#include <boost/endian/arithmetic.hpp>
 
#include <fmt/printf.h>
 
using namespace boost::endian;
 
#pragma pack(push, 1)
struct Foo {
    big_int24_t x;
    big_int24_t y;
};
#pragma pack(pop)
 
 
int main()
{
    std::array<uint8_t, 12> buf = {};
 
    Foo *p = (Foo *)buf.data();
 
    p[0].x = 0x010203;
    p[0].y = 0x040506;
    p[1].x = 0x070809;
    p[1].y = 0x0A0B0C;
 
    for (const auto &ch : buf) {
        fmt::print("0x{:02X} ", ch);
    }
    fmt::print("\n");
 
    p[0].x = 1;
    p[0].y = 2;
    p[1].x = p[0].x * 10 + p[0].y / 3;
    p[1].y = (p[0].x * 33) % 13 - p[0].y + 3;
 
    std::cout << "(" << p[0].x << ", " <<  p[0].y << ")\n";
 
    fmt::print("({}, {})\n", p[1].x, p[1].y);
 
    return 0;
}
Вот её вывод:
Code
1
2
3
0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 
(1, 2)
(10, 8)
Это показало, что big_int24_t хранится в трёх байтах, обладает арифметическими операциями (т.е выглядит и крякает как утка).

"Есть ли аппаратное трёхбайтовое целое?". Нет. Это и ТС знает. Он и спрашивает как работать с такими случаями. Очевидно, что побайтово. Но использование в С++ типов-обёрток упрощает эту работу.
На практике мне приходилось работать с сетевыми пакетами, в которых 3-байтовые целые (и это в рамках индустриальных протоколов). Аналогичный трюк очень сильно упрощает код.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
14.10.2020, 14:06
ага, вот мы наконец-то и пришли к типам..
напоминаю, что ТС речь завёл про 3-х байтовое число, которого просто не существует.
число определяется типом, а не умозаключением - "для его хранения достаточно трёх байтов"
0
фрилансер
 Аватар для Алексей1153
6510 / 5769 / 1135
Регистрация: 11.10.2019
Сообщений: 15,410
14.10.2020, 14:16
_lunar_, ограничения вычислителя - процессора - заставляют нас разместить это трёхбайтовое число в контейнер
(например, в тип uint32_t), чтобы использовать в вычислениях. Но число то прекрасно существует
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
15.10.2020, 00:14  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
приведите пример 3-х байтового числа?
char это 2 в 8ой степени, short это 2 в 16ой, то что стоит посередине это примерно 2 в 12ой так что всё можно считать как угодно.

Добавлено через 8 минут
Цитата Сообщение от AlexVRud Посмотреть сообщение
Foo *p = (Foo *)buf.data();
А почему так нельзя записывать числа, предположим есть структура Foo p[5], внутри она 3ёх байтовая, далее мы пишем так *p=(Foo)12345, как превратить число в структуру?

Добавлено через 3 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
ограничения вычислителя - процессора - заставляют нас разместить это трёхбайтовое число в контейнер
(например, в тип uint32_t)
т.е. как ни крути использование: сложение вычитание присваивание ит.д. типов данных на 3,5,6,7 байт невозможно?
0
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
15.10.2020, 00:58
Цитата Сообщение от Nexi99 Посмотреть сообщение
char это 2 в 8ой степени, short это 2 в 16ой
Ничего из этого не гарантировано.

Цитата Сообщение от Nexi99 Посмотреть сообщение
сложение вычитание присваивание ит.д. типов данных на 3,5,6,7 байт невозможно?
"Сложение, вычитание, присваивание" можно переопределить под свои нужды под различные типы данных, так что, формально, можно. Если же говорить именно про арифметические типы размером 3, 5, 6, 7 байт, то стандарт не имеет ничего против этого, но на наиболее широко распространённых архитектурах таких размеров нет. Ну и, само собой, если говорить про размер как таковой, то лучше в битах, потому что байт не обязан быть привычным восьмибитным.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
15.10.2020, 01:04  [ТС]
Цитата Сообщение от Zirak Посмотреть сообщение
Ну и, само собой, если говорить про размер как таковой, то лучше в битах
Я хочу попробовать с битами поиграться по идее есть biset значит кроме вещественных значений можно вернуть что угодно.
0
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
15.10.2020, 01:07
Вернуть можно что угодно и без битсета.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
15.10.2020, 01:23  [ТС]
Цитата Сообщение от Zirak Посмотреть сообщение
Вернуть можно что угодно и без битсета.
записать двоичное число в переменную не получается.
C++
1
2
int x=0xb00000100000001;//если добавит 0ей больше уже не работает почему не знаю
cout<<"x "<<x<<" "<<bitset<20>(x)<<en;
Также возникает вопрос как выполнить х=bitset<20>(x)
0
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
15.10.2020, 01:39
Цитата Сообщение от Nexi99 Посмотреть сообщение
C++
1
int x=0xb00000100000001;
C++
1
int x=0b00000100000001;
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
15.10.2020, 01:46  [ТС]
Цитата Сообщение от Zirak Посмотреть сообщение
int x=0b00000100000001;
У меня такое не катит. Т.е. так 0b00000100000001 можно любое количество бит писать?
0
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
15.10.2020, 01:53
Писать можно любое, но не любое, очевидно, поместится. И компилятор, по идее, не переварит значение, которое невозможно уместить ни в один целочисленный тип.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
15.10.2020, 02:02  [ТС]
Цитата Сообщение от Zirak Посмотреть сообщение
Писать можно любое, но не любое, очевидно, поместится. И компилятор, по идее, не переварит значение, которое невозможно уместить ни в один целочисленный тип.
int вмещает 32 бита, если к такой записи добавить 2 0-я уже подчёркивает красным, а ещё как я понял передать двоичное число в переменную невозможно. Как сделать х=bitset<20>(x)?
0
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
15.10.2020, 02:13
Возможно, конечно, обновляй компилятор.

C++
1
2
3
4
5
6
7
8
9
10
11
    char a1 = 0b0; // ok
    unsigned char a2 = 0b1; // ok
    signed char a3 = 0b10; // ok
    signed short a4 = 0b11; // ok
    unsigned short a5 = 0b100; // ok
    signed int a6 = 0b101; // ok
    unsigned int a7 = 0b110; // ok
    signed long int a8 = 0b111; // ok
    unsigned long int a9 = 0b1000; // ok
    signed long long int a10 = 0b1001; // ok
    unsigned long long int a11 = 0b1010; // ok
Цитата Сообщение от Nexi99 Посмотреть сообщение
Как сделать х=bitset<20>(x)?
Никак, такое преобразование не определено.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
15.10.2020, 05:50
Цитата Сообщение от Nexi99 Посмотреть сообщение
сложение вычитание присваивание ит.д. типов данных на 3,5,6,7 байт невозможно?
Для сложения, вычитания, присваивания и т.д. С++ нужны соответствующие операторы +, -, = и т.д. Если есть встроенные или определённые в программе операторы, можно конструировать и успшно компилировать выражения с этими операторами.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
16.10.2020, 02:21  [ТС]
Цитата Сообщение от Zirak Посмотреть сообщение
Никак, такое преобразование не определено.
Я думаю что bitset представляет строку, по сути массив char, если ошибся извиняюсь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.10.2020, 02:21

Arduino UNO. Прочитать несколько байт
Здравствуйте! Пытаюсь прочитать несколько байт в Arduino UNO. Я написал такой код: void setup() { Serial.begin(9600); ...

Как прочитать первые 7 байт и сравнить?
Всем привет. Имеется вопрос как/куда мне записать первые 7 байт файла, что бы потом сравнить с эталоном. Как понимаю надо переводить в 16...

Не получается прочитать картинку в массив байт
Привет всем. У меня такая проблема. на строчку byte img = System.IO.File.ReadAllBytes(&quot;путь&quot;); Компилятор пишет ошибку...

I2C - не успеваю прочитать байт из буфера
#include &quot;stm32f10x.h&quot; #define MMA_W 0x1D&lt;&lt;1 #define MMA_R (0x1D&lt;&lt;1)|0x01 #define MMA_MCR 0x16&lt;&lt;1 #define MMA_MCR_MODE 0x03 ...

Как прочитать несколько байт из файла с n-го бита
Требуется считать байты из файла заданным смещением; смещение задается в БИТАХ; Например: c 3-го бита 8-го байта прочитать 21 байт;


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
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
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru