Как преобразовать строку в int без пропуска первых нулей?

Примечание. Я не пытаюсь преобразовать hexttoInt здесь.. чего я хочу добиться, так это того, что у меня есть 9 цифр серийного номера 305419896 (десятичный) в шестнадцатеричном формате 12345678.. Я просто пытаюсь взять 0x1234 как одно значение и 0x5678 как другое ценность..

Мое десятичное число — 021340031, а в шестнадцатеричном формате — 01459F7F и разбивается на две строки, такие как "0145" и "9f7f".. Мне нужно это строковое значение в формате, например 0x0145, 0x9f7f..

Для этого я сначала пытаюсь преобразовать Str в Int.

 let firstValue = Int("0145") 

тогда я получаю только 145 ..

Есть ли способ напрямую преобразовать String в UInt16 или как-то обойти, чтобы получить ожидаемые значения?


person tp2376    schedule 09.05.2018    source источник


Ответы (2)


Если я правильно понимаю, вы хотите разделить свой шестнадцатеричный код пополам и отобразить два младших байта и два старших байта?

Для этого используйте битовую маску и операторы сдвига битов:

let a = 0x00045678

let first = (a >> 16) & 0x0000FFFF
let second = a & 0x0000FFFF

let firstString = String(format:"0x%04X", first)
let secondString = String(format:"0x%04X", second)

Выход:

0x0004
0x5678

Формат 0x%04X будет печатать шестнадцатеричное число, состоящее не менее чем из 4 цифр, при необходимости с ведущими нулями.

person mag_zbc    schedule 09.05.2018
comment
спасибо, я попробовал это с let a = 0x01459F7F, но я получаю.. 0x145 0x9F7F значения 0x145 и 0x0145 одинаковы...? также мне это нужно в Int, а не в виде строки. любая помощь - person tp2376; 09.05.2018
comment
thnaks для этого .. как я могу получить это строковое значение в Int (хотя мне нужно такое же значение) ..? - person tp2376; 09.05.2018
comment
Да, 0x0145 — это то же значение, что и 0x145, ведущие нули можно игнорировать. Если вы хотите, чтобы это было как Int, вам нужны переменные first и second - я просто добавил строки, чтобы показать, что они содержат правильные шестнадцатеричные значения. - person mag_zbc; 09.05.2018
comment
Спасибо, мне нужны строковые значения 0x145, 0x9F7F, но мне нужно без кавычек, чтобы я мог передать их напрямую... любые идеи... - person tp2376; 09.05.2018

UInt16 не является основанием 16 Int, это Int с 16-битной памятью.

Вам нужен малоизвестный инициализатор Int...

let firstValue = Int("0145" radix: 16)

Это даст вам шестнадцатеричное значение для строки. Однако он все равно удалит все начальные нули, поскольку они не имеют значения. Невозможно избежать этого.

Примечание. Вы можете использовать практически любое значение для radix, которое вы хотите, и вы можете получить строки из целых чисел таким же образом, если вам нужно преобразовать обратно в какой-то момент.

person theMikeSwan    schedule 09.05.2018