C++, объединить 2 переменных с байтами в одну
- Войдите на сайт для отправки комментариев
Пт, 12/02/2016 - 21:54
Добрый день господа! Не силен в С++ сразу говорю, сильно не ругайте... Есть 2 переменные типа int8_t. Например HL=32 и LO=16, как в третью переменную этого же типа получить результат RZ=3216 ???
Какая операция соединит значения этих двух переменных? Пробовал RZ=HL&LO, не помогло... rz=word(hl,lo) тож фигню какую-то выдает ))) Чую что есть что-то простое )))
RZ= HL*100+LO
аха , только RZ нужно объявить как int ? или повыше ?
а что будет при , например , HL=255 и LO=255 ?
если HL < 99 и LO < 99 - то всё будет хорошо ?
так ?
SU-27-16, если исходник -байт, значит самое большое число будет 255*100+255=25755, что вписывается в дефолтовый int :)
Хотя для трёх цифр алгоритм усложнять нужно... :))
Вот косяк на практике получается ))) в HI = 12 LO=34 RZ получился = 60 (3Ch) )))
Как это посчиталось так? ))
Имеет ли значение - система исчисления???
SU-27-16, если исходник -байт, значит самое большое число будет 255*100+255=25755, что вписывается в дефолтовый int :)
Хотя для трёх цифр алгоритм усложнять нужно... :))
Тут и для трех усложнить не помешало бы:
"Объединяем" 1 и 2. Получаем 102. А нужно 12. Как быть?
это понятно...
но ТС , видимо , хочет рулить HL = сотни в десятичном , а LO = десятки в десятичном....
вот и хотел сказать , что HL>=100 или LO>=100 приведут к неадкватному значению....
uint8_t au8Buffer[MAX_BUFFER];
int8_t MyGetAdr=au8Buffer[ ADD_HI ]*100+au8Buffer[ ADD_LO ];
int8_t MyGetAdrL=au8Buffer[ ADD_LO ];
int8_t MyGetAdrH=au8Buffer[ ADD_HI ];
int8_t MyGetCoil=au8Buffer[ NB_HI ]*100+au8Buffer[ NB_LO ];
int8_t MyGetCoilL=au8Buffer[ NB_LO ];
int8_t MyGetCoilH=au8Buffer[ NB_HI ];
полный расклад )
ТС , поясни - что в байтах сидит !
...от этого и будет пересчёт :)
Dr_grizzly, а ничего что int8_t только до 127 считает умеет? :)
HL=32 и LO=16, как в третью переменную этого же типа получить результат RZ=3216 ???
это частный случай....
по вышепредложенному получится именно 3216
HL=255 и LO=255, как в третью переменную этого же типа получить результат RZ=................. ???
получится = 255*100+255 = 25755
оно тибе надо такое ?
uint8_t au8Buffer - сидит hex значение, к примеру - 03041234
в коде еще такая функция встречается:
- результат правда не знаю..
Dr_grizzly, а ничего что int8_t только до 127 считает умеет? :)
Какой тип тогда нам подойдет? )) int16_t ? или uint16_t ? ))
Dr_grizzly, не знаю что у вас за функция, но байты складывают иначе, int x = Hi_byte<<8 | Lo_byte;
Dr_grizzly , http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Мне еще рано писать такие штуки ))) я только учусь, но задача стоит и приходится раскапывать чужую библиотеку с ModBus протоколом... поэтому нуждаюсь в помоще зала ))
Может стоит сюда вывалить код всей библиотеки? )))
Dr_grizzly, а ничего что int8_t только до 127 считает умеет? :)
Какой тип тогда нам подойдет? )) int16_t ? или uint16_t ? ))
определи - что в HL и в LO сидит.... потом уже решать можно будет....
Мне еще рано писать такие штуки ))) я только учусь, но задача стоит и приходится раскапывать чужую библиотеку с ModBus протоколом... поэтому нуждаюсь в помоще зала ))
Может стоит сюда вывалить код всей библиотеки? )))
вот зал и спрашивает - чего тибе хочется ?
весь код нафиг никому не нужен....
есть HL и LO - что из них надо поиметь ?
Привожу весь код библиотечки:
Мои добавленные строки 156 - 163 и 665 - 672...
Простите за галочку )))
Dr_grizzly , "галочка" - свернуть код !
весь код - не нужен , обычно....
Дело в том, что когда я не понимаю что ходит по переменным я использую Debugger и StepByStep отслеживаю все изменения... У ардуино я не нашел такой возможности )) поэтому мне проще вам показать то с чем я голову ломаю, может быстро определите наметанным глазом что там может быть...
Кста. Исправил переменную int8_t на int16_t - если был результат 3С то стал 073С )))
По сути там пакет modbus в HEX виде.... Я пытаюсь разложить опредленные данные по переменным, чтобы потом формировать свои пакеты.
вопрос был про HL и LO -> преобразование....
этот вопрос закрыт ?
HL=32 и LO=16, как в третью переменную этого же типа получить результат RZ=3216 ???
это частный случай....
по вышепредложенному получится именно 3216
HL=255 и LO=255, как в третью переменную этого же типа получить результат RZ=................. ???
получится = 255*100+255 = 25755
оно тибе надо такое ?
Как я понял, что данная процедура не уместна если значение байта =255 и второго 255... Но ведь в модбас возможно такое, что адрес состоит из FFFFh тогда старший и младший байт не получить таким способом... Есть еще варианты?))
Dr_grizzly, я ж вам написал в #14 как складывать..
Dr_grizzly, я ж вам написал в #14 как складывать..
Простите, не понял просто что там за комманда )) ща воткнул в свой код и все получилось!!! УРААА!!)) СПААСИБО!
Простите, не понял просто что там за комманда
Там битовый сдвиг влево (<<) и побитовое "или" ( | ).
https://ru.wikipedia.org/wiki/Битовые_операции
http://www.c-cpp.ru/books/bitovye-operatory
У меня почему то не работает, откуда то 532 получается. Хотя вроде раньше работало.
2*256 + 20 == 532, хоть ты тресни
а вот если напишешь
Hi = 0x02;
Lo = 0x20;
тогда, 544
Симен, а как в таком случае 220 получить? переводить в String складывать потом в uint16_t ? Тока так?
512 + 32, даже в уме складываю. Пока.
Симен, а как в таком случае 220 получить?
в каком счислении?
512 + 32, даже в уме складываю. Пока.
у него не HEX
Симен, а как в таком случае 220 получить? переводить в String складывать потом в uint16_t ? Тока так?
как дед скажет, ты наркоман что-ле?
Да так же в десятичном. Можно и в hex. Если через String, то там вроде можно String a = (Index, HEX); но все как то мудрено. Из байтов лепить строку, потом в число.
Симен, а как в таком случае 220 получить?
0x220 ? - так вы его и получаете - 0х220 = 544
Симен, а как в таком случае 220 получить?
0x220 ? - так вы его и получаете - 0х220 = 544
Вообще удивительно, если байты представлены в десятичном виде, она мне склеивает как шестнадцатиричные.
Симен, а как в таком случае 220 получить?
правда наркоман
Вообще удивительно, если байты представлены в десятичном виде, она мне склеивает как шестнадцатиричные.
Нет
Вообще удивительно, если байты представлены в десятичном виде, она мне склеивает как шестнадцатиричные.
пипец ты темный... байты всегда байты и как ты их не представляй - имеет значение только их ЗНАЧЕНИЕ, а не представляение
0х220 и 544 это одно и тоже
И эти два выражения абсолютно эквивалентны
(0х02 << 8) | 0x20
(2 << 8) | 32
[/quote]
правда наркоман
[/quote]
Вы о ком? Hi =2, а не 0x02, и Lo = 20, a не 0x20. Мне нужно просто склеить два десятичных числа в одно.
Вы о ком? Hi =2, а не 0x02, и Lo = 20, a не 0x20. Мне нужно просто склеить два десятичных числа в одно.
что это за операция - "склеить" ?
причем тут тогда битовые сдвиги, вы в своем уме?
точно наркоман
если вам надо "склеить" 220 из отдельных цифр - то их должно быть три - '2' '2' и '0'. Не бывает такой цифры - 20
Правда, наркоман. Клей 2*100+20.
На тебя извели целую рощу стоеросового дерева. Брось ютубчики смотреть, начни читать, а то совсем оскотинишьса.
Правда, наркоман. Клей 2*100+20.
На тебя извели целую рощу стоеросового дерева. Брось ютубчики смотреть, начни читать, а то совсем оскотинишьса.
Не годится этот вариант. Если hi = 1, а lo = 0.
я пас.... с такой тупостью давно не сталкивался.
Обьясни, что те надо, чудо!
Только не спрашивай как "склеить" - напиши где у тебя такая задача возникла. Наверняка какую-то дурость делаешь, типа обнуления миллис
Мне надо склеить два байта 2 и 220, и получить одно целое число 220.
новая задача, не имеющая ничего общего с предыдущими.
Раз у тебя младший байт УЖЕ 220 - просто отбрось старший и все.
я - пас.
В школе учился? 2 х 100 + 20
Туцик
Мы услышим рассказ, нахера это надо?
Абсолютно точно это так называемая "проблемаXY". Это когда человеку надо Х, но он уверен что это делается через Y, поэтому он идет и задает вопрос о Y. Через два дня дискуссий выясняется, что никого Y и не требовалось
https://xyproblem.info/
да мне понятно чЁ ему надо
ему надо получить
вот он через стринг и трахается, но вопрос правильный - НАХУЯ?