Преобразование типов
- Войдите на сайт для отправки комментариев
Втр, 23/10/2018 - 03:29
у меня есть число, большое, моя задача разбить его на байты и записать в массив, я успешно справляюсь, но в массив записываются hex значения вместо нужного десятичного!
void get_apdu_un(unsigned long int NUM,uint8_t *arr)
{
NUM=999;
uint8_t UN[4];
UN[3]= NUM&0xFF;
UN[2]=(NUM>>8)&0xFF;
UN[1]=(NUM>>16)&0xFF;
UN[0]=(NUM>>24)&0xFF;
arr[5]=UN[0];
arr[6]=UN[1];
arr[7]=UN[2];
arr[8]=UN[3];
}
такой код выдает 00 00 03 E7 вместо 00 00 09 99 как бы это решить?
битовые операции определены только для двоичного (или что в данном случае одно и то же - шестандцатиричного) представления чисел, поэтому поделить ими число на десятичные разряды никак не получится.
Если немного подумать - для разбиения на байты шестнадцитиричного числа вы используете битовые сдвиги. Битовый сдвиг вправо равносилен целочисленному делению на соответсвующую степень двойки.
Аналогично - для разбиения числа на десятичные разряды используйте целочисленное деление на стпени десятки.
Только я что-то не уверен, понимаете ли вы что делаете. Например, понимаете ли вы, что разделить число на байты в десятичном представлении нельзя?
Успешно справился, называется) если байты нужны, указатели не помогут? Зачем память засирать?
чуть конкретнее коллега?
коли ты понимаешь чо делаешь, прочитай чонить за BCD арифметику.
NUM=999;
Код выдает правильный. А для понимания того КАК получить то что вы хотите - попробуйте разобраться в ДВОИЧНО-ДЕСЯТИЧНОМ представлении числа. Возможно это поможет.
SadiQ228, числа в десятичном, двоичном, шестнадцатиричном представлении - это не числа, а текст.
Т.е. существует внутреннее представления числа, как оно хранится в компьютере и как оно обрабатывается (все арифметические и логические операции), но человек в таком виде числа не воспринимает, поэтому исключительно для того, чтобы посмотреть на эти числа глазками, их переводят в текст, т.е. десятичное, двоичное, восьмиричное... представления.
Так что ту задачу, которую Вы озвучили, Вы решаете вполне успешно.
Но подозреваю, Вам нужно было не разбить число на байты, а представить его в виде десятичных разрядов. Это гораздо более трудоемкая операция и решается она через деление и взятие остатка:
UN[0] = NUM%10;
UN[1] = (NUM/10)%10;
UN[2] = (NUM/100)%10;
По-моему ТС нужно познакомиться с sprintf()
Вряд ли это то, что ему нужно.
Насколько я понял, ему нужно, чтобы в массиве были числа от 0 до 9, а не цифры от '0' до '9' (АКА числа от 48 до 57).
Но подозреваю, Вам нужно было не разбить число на байты, а представить его в виде десятичных разрядов. Это гораздо более трудоемкая операция и решается она через деление и взятие остатка:
не знаю, что в этой операции "более трудоемкого". Как я написал в сообщении #1 - суть точно такая же, как и в битовых сдвигах, только деление на степени двойки заменяем на степени десятки - и все
не знаю, что в этой операции "более трудоемкого"
Деление всегда было трудоемкой операцией.
Над числами int на AVR деление выполняется 240 тактов против 6, а над числами long - 680 против 16.
я бы сделал что-то аналогичное команде xlat для intel процессора, там оно выполняется за один такт
И как это поможет работать с многобайтовыми числами?
(если надо 4-байтовое число преобразовать в 4-байтовое, то размер таблицы 16 Гбайт)
И как это поможет работать с многобайтовыми числами?
(если надо 4-байтовое число преобразовать в 4-байтовое, то размер таблицы 16 Гбайт)
Вы не правы коллега, его код
разбивает на байты, осталось только преобразовать побайтно, это всего 100 байт таблицы (от 0 до 99),
остаются вопросы зачем это надо, ведь для последующего использования требуется обратное преобразование, а это еще 100 байт
Может быть правда на своём хоббиуровне чего-то и не допонимаю )))
Давайте подожём ТС и поймем однозначно что значит "разбить число на байты", может он хочет по байтам переслать инфу, или всё же очередной велосипед на костылях собирается
Скорее всего у ТС когнитивные нарушения -- он выводит байты в хексе и офигевает от их представления.
спасибо коллеги, andriano подал верную мысль!
А тс не уталит наш праздный интерес? Где на практике применяется такой изврат?
легко конверитровать байт HEX в DEC, это применяется в метод print
starbit, нет, ты его не так поняла.
Ему BCD надо
К сожалению, он не может объяснить, что ему надо.
KOSTET прости друг я не могу рассказать) проблема решена!
KOSTET прости друг я не могу рассказать) проблема решена!
Остальные могут продолжать гадания - а что же было нужно?
Сверхсекретный индикатор )
Удобная вещь. Роешься в чужом сейфе . Как только индикатор показывает что свехсекретно. То это оно и надо. Очень экономит время. Особенно если это ночью и хозяин сейфа спит не далеко.
такой код выдает 00 00 03 E7 вместо 00 00 09 99 как бы это решить?
разбивает на байты, осталось только преобразовать побайтно, это всего 100 байт таблицы (от 0 до 99),
А ну-ка расспишите подобно алгоритм, как побайтно из 0x03e7 получить 0х0999.
присоединюсь к последнему вопросу)))))00
Все очень просто: 0x03e7 + 0x05b2 = 0x0999. Гы-гы-гы.
такой код выдает 00 00 03 E7 вместо 00 00 09 99 как бы это решить?
разбивает на байты, осталось только преобразовать побайтно, это всего 100 байт таблицы (от 0 до 99),
А ну-ка расспишите подобно алгоритм, как побайтно из 0x03e7 получить 0х0999.
Издеваешься ДА?
Делается одной командой выполняемой за один такт процессора на один байт преобразования и называется эта команда в процессоре INTEL - XLAT (в таблице HEX значения от 0 до 99, после 9 идёт 0x10 а не 0x0A то-есть вместо 0xe7 будет 0x99 и т.д.)
Делается одной командой выполняемой за один такт процессора на один байт преобразования и называется эта команда в процессоре INTEL - XLAT
была. щас ее выпилили вместе с DAA и иже с ними
Издеваешься ДА?
Делается одной командой выполняемой за один такт процессора на один байт преобразования и называется эта команда в процессоре INTEL - XLAT (в таблице HEX значения от 0 до 99, после 9 идёт 0x10 а не 0x0A то-есть вместо 0xe7 будет 0x99 и т.д.)
Т.е. первые 10 значений (от 0 до 9) в таблице повторяют номер ячейки?
Тогда второй (по старшинству) байт будет перекодироваться в 3, а нужно - в 9.
Делается одной командой выполняемой за один такт процессора на один байт преобразования и называется эта команда в процессоре INTEL - XLAT
была. щас ее выпилили вместе с DAA и иже с ними
Козлы!
Я использовал метод для шифрования )))
Давненько это было, конец 80-х
команда в процессоре INTEL - XLAT (в таблице HEX значения от 0 до 99, после 9 идёт 0x10 а не 0x0A то-есть вместо 0xe7 будет 0x99 и т.д.)
Т.е. первые 10 значений (от 0 до 9) в таблице повторяют номер ячейки?
Тогда второй (по старшинству) байт будет перекодироваться в 3, а нужно - в 9.
Тогда большая таблица )))
ТС бы определиться насколько большое число надо пребразовывать
Я какабычно все перепутал, XLAT не выкинули, выкинули команды bcd арифметики, ну и всякие INTO, BOUND, ARPL, PUSHAD, POPAD с ними, все равно ими никто не пользовался
Я какабычно все перепутал, XLAT не выкинули, выкинули команды bcd арифметики, ну и всякие INTO, BOUND, ARPL, PUSHAD, POPAD с ними, все равно ими никто не пользовался
Как никто, а я???
:)
:)
на самом деле, кто тогда очередной драйвер клавиатуры не писал, вторую часть таблицы как только не кодировали, даже болгарская кодировка была
было дело .. тоже писал.
было дело .. тоже писал.
Но, как обычно - недописал, споткнулся на макросах :))))))
Дима, я тебя по-человечески предупреждал - захлебнешься в собственном поносе .. не помогло, похоже. Ну как знаешь, учредитель ты наш недоученный.
Дима, я тебя по-человечески предупреждал - захлебнешься в собственном поносе .. не помогло, похоже. Ну как знаешь, учредитель ты наш недоученный.
Архатушка-больна головушка, ты даже искать в гугле не умеешь, не говоря уже про макросы :) Ты там случайно отчество не попутал, а то Порохня - фамилия хоть и редкая, но всё же встречается. Как бы ты и тут не обосрался, по привычке-то.
По-человечески - ты просто не способен общаться, так и норовишь исподтишка уколоть. Я же говорю - гнида.
Таких мудаков, как ты, архатушка - чмарил и буду чмарить. Покуда ты поступаешь подло и низко - будешь получать в ответочку тот понос, которым ты тут всё уже залил. Всё просто. Если твоя буйная головушка не способна понять эту простую истину - ничего, вобъём потихоньку.
Детишек как - уже прекратил бить линейкой, или по прежнему - орёшь и п@здишь их почём зря, истеричка ты наша?
А вот как привезут к нам, в Сибирь по этапу, тогда и проверим твое отчество. А заодно и вежливости поучим .. ты тут тое-кого "обидел". А впрочем, сам узнаешь.
А вот как привезут к нам, в Сибирь по этапу, тогда и проверим твое отчество. А заодно и вежливости поучим .. ты тут тое-кого "обидел". А впрочем, сам узнаешь.
О, ты уже на угрозы перешёл? Характеризует :), впрочем, это неудивительно.
Теперь о главном: понимаю, что у тебя свербит, как бы меня уколоть - вспоминая и ветеринарию, и ещё чего-то там выдуманное, типа каких-то там учредителей - это к психиатру, что называется. Для адекватных - я как-то упоминал, что жизнь - она разная, повторюсь и здесь: да, учился в МВА. И - бросил, потому что со второго курса понял, что - не моё. Так - тебе понятней будет? Более того, я тебе ещё больше поводов для подколок дам, чего уж там: по желанию родителей - отучился в своё время в медицинском училище, вот такой я послушный сын. Отучился, отчитался - и хорош. Ни по ветеринарии, ни по медицинской части - ни дня не работал, более того, повторюсь: достаточно быстро понял, что это не моё.
Ещё чего-нибудь о себе рассказать, чтобы дать тебе ещё больше поводов для дешёвых подколок? Не стесняйся - спрашивай. Всё равно, что касается тематики форума - в отличие от тебя, в простейших косяках с макросами и в чрезмерно раздутом ЧСВ - я тут не замечен.
Предупрежу честно: ещё раз от тебя прочитаю какие-то высеры касаемо любого в мой адрес, не относящегося к тематике форума, сиречь программированию микроконтроллеров - буду сразу посылать на йух, надоело с тобой, уродом, цацкаться. Тратить на тебя, кусок недоразумения, драгоценное время, пытаясь как-то там завуалировать - нунах, что называется.
И напоследок - напомню тебе: не я ли исподтишка редактировал чужие посты? Не я ли удалял всё, что мне не понравилось, просто потому, что могу? Ребятёнок - повзрослей уже, и научись отвечать за свои слова и поступки. Грозится он мне, щегол пестрожопый.
Да на хрен ты МНЕ усрался? Дурак и уши холодные, проверь. :)
дипутат несостоявшияся..
Да на хрен ты МНЕ усрался? Дурак и уши холодные, проверь. :)
Во, так и запишем - я архату не усрался. Принимается. Надеюсь, ты меня услышал. В любом случае - предпочту вооружённый до зубов нейтралитет: ты не задеваешь меня, я - не трогаю тебя. Но, извини, если от тебя будут косяки по программированию - пройти мимо не смогу, обязательно укажу. Тебя - призываю к тому же.
дипутат несостоявшияся..
Было дело, да. Считаю - правильно тогда поступил: надо было остановить строительство стеклотарного завода в городских пределах. Для этого нужна была разносторонняя кампания, что я и сделал. Не один, конечно. По факту кампании - сменился бессменный мэр, который и позволил, собственно, этому безобразию начать крутиться. В отличие от тебя - я забочусь о будущем детей, как своих, так и чужих - а не просто бью их линейкой по рукам и истерю на них, захлёбываясь в крике. Тебе амперку напомнить, или да?
Прекращай обсираться, болезный. Предлагаю нейтралитет, читай первый абзац.
Тогда большая таблица )))
ТС бы определиться насколько большое число надо пребразовывать
А он определился. Еще в исходном сообщении темы. Там фигурирует "unsigned long int", и код расписан на 4 байта.
А в посте №12 я привожу оценку размера таблицы.
Так что все давным давно известно.
Тогда большая таблица )))
ТС бы определиться насколько большое число надо пребразовывать
А он определился. Еще в исходном сообщении темы. Там фигурирует "unsigned long int", и код расписан на 4 байта.
А в посте №12 я привожу оценку размера таблицы.
Так что все давным давно известно.
пропустил видимо, невнимательность моя всему виной, тогда преобразовать в CHAR из строки числа по байтно по таблице, таблица будет 10 байт
пропустил видимо, невнимательность моя всему виной, тогда преобразовать в CHAR из строки числа по байтно по таблице, таблица будет 10 байт
Ну вот и напишите подробно алгоритм, по которому 4-байтовое число будет преобразовываться при помощи 10-байтовой таблицы.
Напомню, нужно преобразовать {0, 0, 0x03, 0xe7} в {0, 0, 9, 0x99} (см. исходное сообщение темы).
пропустил видимо, невнимательность моя всему виной, тогда преобразовать в CHAR из строки числа по байтно по таблице, таблица будет 10 байт
Ну вот и напишите подробно алгоритм, по которому 4-байтовое число будет преобразовываться при помощи 10-байтовой таблицы.
Напомню, нужно преобразовать {0, 0, 0x03, 0xe7} в {0, 0, 9, 0x99} (см. исходное сообщение темы).
Языками не владею )))
Выше предлагали через print, но это даст только символьное представление, кодами таблицы символов для ардуины не владею и, не думаю что он будет совпадать с самим значением, в PC под DOS цифры начинаются с десятного кода 48 - 0, 49 -1 и т д. ( PS да погорячился, не зная истинных значений, значит таблицы в 256 байт будет достаточно) ))) PPS хотя если ряд значений непрерывный, то можно от кода символа выводимого как CHAR отнимать смещение и, тогда 10 байт таблицы хватит)
Я слышал язык С строгий и не допускает такое вольное обращение с переменными, в ассемблере Ты же БОГ