Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/35: Рейтинг темы: голосов - 35, средняя оценка - 4.54
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
1

Как получить из двух byte один int?

16.08.2016, 08:30. Показов 6586. Ответов 55
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно вот, есть две переменные byte
C++
1
2
byte b1 = 0x03;
byte b2 = 0x40;
надо получить одну типа int, но чтобы b1 был старшим байтом, а b2 младшим. Выглядеть будет примерно так:
C++
1
2
3
4
byte b1 = 0x03;
byte b2 = 0x40;
 
int i1 = 0x0340; // 0x03 + 0x40
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2016, 08:30
Ответы с готовыми решениями:

Как из типа данных BYTE получить int и вывести в консоль, GetRValue(color)
Добрый день ! Я хочу вывести в консоль значения красного, зеленого и синего для пикселя. Но при...

Как заполнить один int пустой массив другим int массивом ?
Можно пример кода :)

Как записать и прочитать int (4 byte) из char[]
Buffer.h #ifndef BUFFER_CPP_H #define BUFFER_CPP_H #include <vector> template <class T>...

Как получить int из массива byte
Добрый день! Есть массив байт byte bytes = {0,0,0,1}. Как известно, int (Int32) состоит из 4х...

55
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,662
Записей в блоге: 14
16.08.2016, 14:23 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от HighPredator Посмотреть сообщение
А вот этот анализатор... Ну мы все поняли
Это анализатор в компиляторе TI. Но решения во всём интернете не видится.

Цитата Сообщение от HighPredator Посмотреть сообщение
Кстати, а как мы в С++ оказались?
->
Цитата Сообщение от yurickas Посмотреть сообщение
надо получить одну типа int, но чтобы b1 был старшим байтом, а b2 младшим. Выглядеть будет примерно так:
Похожий вопрос по преобразованию массива байт в другой тип.
0
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
16.08.2016, 14:25 42
Цитата Сообщение от Rius Посмотреть сообщение
Я ответ так и не нашёл.
а где взять такой компилятор злой?
вот такой код не компилируется даже?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdint.h>
#include <string.h>
 
#define float32_t float
 
union
{
    float32_t float_value;
    uint8_t array[4];
} f;
 
 
int main()
{
    uint8_t array[4] = { 0u, 0u, 0u, 0u };
    memcpy(f.array, array, sizeof(array));
    printf("%f\n", f.float_value);
}
http://rextester.com/YNIJ61452
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,662
Записей в блоге: 14
16.08.2016, 14:28 43
C
1
2
3
4
5
union
{
    float32_t float_value;
    uint8_t array[4];
} f;
#1424-D (MISRA-C:2004 18.4/R) Unions shall not be used

Цитата Сообщение от Babysitter Посмотреть сообщение
а где взять такой компилятор злой?
Code Composer Studio, MSP430, компилятор TI v15.12.1.LTS
1
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.08.2016, 14:30 44
Rius, а вы можете переключить анализатор на более позднюю версию стандарта мисры? 2012 к примеру.
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,662
Записей в блоге: 14
16.08.2016, 14:34 45
Не нашёл такой возможности. Похоже гвоздями прибито.
0
Babysitter
16.08.2016, 14:43
  #46

Не по теме:

Цитата Сообщение от Rius Посмотреть сообщение
При полном соответствии с ними число неожиданных ошибок будет меньше.
жесть какая

похоже они просто кричат нам, что такая задача вообще не должна появляться перед нами, потому как решить ее оставшись в пределах этого адского стандарта невозможно. нужно смотреть, как к нам вообще попадает это число в разобраном виде, может так и не должно быть?

может можно загнать в uint32_t, а потом попробовать битовыми операциями поковырять?

0
Rius
16.08.2016, 15:21
  #47

Не по теме:

Babysitter, в той области, где возник этот стандарт, лучше перебдеть.
С битами из uint32_t ещё больше шанс ошибку закодить.

0
Модератор
3388 / 2160 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
16.08.2016, 15:32 48
Цитата Сообщение от Rius Посмотреть сообщение
С битами из uint32_t ещё больше шанс ошибку закодить
но похоже нас именно к этому и толкают))
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
16.08.2016, 16:34 49
Цитата Сообщение от Babysitter Посмотреть сообщение
adaptor.bytes.b1 = 0x03;
adaptor.bytes.b2 = 0x40;
int i1 = adaptor.word;
это же UB не?
1
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
16.08.2016, 19:47 50
Цитата Сообщение от Raali Посмотреть сообщение
это же UB не?
почитаю вечерком стандарт, если таки да, то это предательство со стороны плюсов
в чистом си можно было, тут зависит вроде от времени жизни как-то. напишу точнее потом
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
16.08.2016, 20:38 51
Цитата Сообщение от Rius Посмотреть сообщение
i1 = 256 * b1 + b2;
Да, конечно... Попутал слегка...
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
17.08.2016, 20:31  [ТС] 52
Ладно, следующая проблема:

имеем адрес в памяти, например 0x004532.

Как представить это число в byte, чтобы:
C++
1
2
3
byte HighByte = 0x00;
byte MiddleByte = 0x45;
byte LowByte = 0x32;
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
17.08.2016, 20:40 53
yurickas,
C++
1
2
3
    uint8_t HighByte = (addr >> 16) & 0xFF;
    uint8_t MiddleByte = (addr >> 8) & 0xFF;
    uint8_t LowByte = (addr) & 0xFF;
addr предварительно преобразовать в целое число подходящей разрядности.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
17.08.2016, 20:44 54
Если этот адрес (числовое значение) записано в переменную, то определяем (или на основе сакрального знания хардкодим) порядок хранения байт (endianness), и в соответствии с ним и размером переменной в которой хранится адрес, выдираем байты, откастовав адрес к указателю на беззнаковый чар. Принцип и подсказка здесь: Функция is_little_endian
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
18.08.2016, 07:15  [ТС] 55
Там фокус в чем. Пишу программу для диагностики авто. Есть функция чтения прошивки ЭБУ. Формируется пакет данных по байтам. В пакете байт команды и байты параметров команды. Так вот, в параметрах команды идут 4 байта. Первые 3 - это адрес в памяти ЭБУ с которого я хочу считать данные. Представлены они как написал выше. Четвертый - сколько байт хочу считать.
Так вот, чтобы хардкорить надо иметь число с размерностью 3 байта, а потом его уже разбивать на байты.


Ну, это так, на будущее. Сейчас написал рабочую библиотеку на плюсах, ибо на шарпе было много проблем с маршалингом. Сейчас надо пробовать написать ее на CLI чтобы дальше работать с шарпом.
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,662
Записей в блоге: 14
18.08.2016, 07:17 56
Цитата Сообщение от yurickas Посмотреть сообщение
надо иметь число с размерностью 3 байта, а потом его уже разбивать на байты.
Не надо. Uint32 тоже подойдёт. Старший байт держать равным 0.
0
18.08.2016, 07:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.08.2016, 07:17
Помогаю со студенческими работами здесь

Варианты конвертации bool/byte/int в byte/int
В Си, если мне не изменяет память можно наоборот любые данные интерпретировать как true/false. А...

Как переконвертировать int в byte[]?
Как переконвертировать hex занчение int в byte? Чтобы int a = 0x45C5; cтало byte b = new byte...

Что делает Read(byte[] buffer, int offset, int count) метод класса Stream
Что делает Read(byte buffer, int offset, int count) метод класса Stream. Приведите пример...

Dictionary<int, int> получить наибольшее значение value (втрого int)
Dictionary&lt;int, int&gt; bet = new Dictionary&lt;int, int&gt;; bet.Add(1,20); bet.Add(2,50); int i = //...


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

Или воспользуйтесь поиском по форуму:
56
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru