Как преобразовать строку в int без пропуска быстрых первых нулей? - PullRequest
0 голосов
/ 09 мая 2018

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

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

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

 let firstValue = Int("0145") 

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

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

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

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

То, что вы хотите - это малоизвестный инициализатор Int

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

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

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

0 голосов
/ 09 мая 2018

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

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

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 цифр, с начальными нулями, если необходимо

...