#arrays #delphi #hex #apdu
Вопрос:
Я пытаюсь добавить 00 для каждого отсутствующего элемента массива байтов, чтобы лучше это объяснить, если lenght
из массива 20, а строка заполняет только 9 пробелов (перевернутых), мне нужно, чтобы остальные 11 пробелов были 00
. Пример объяснит это лучше.
До сих пор это мой код:
var
dateAndTimeOfIssue, taxPayerId: Tarray<Byte>;
dateOfIssueMS, DOIReversed: int64;
begin
dateOfIssueMS := StrToInt64(MilliSecondsBetween(f.InvoiceRequest.dateAndTimeOfIssue,
UnixDateDelta).ToString);
ReverseBytes(@(dateofIssueMS), @(DOIReversed), SizeOf(dateofIssueMS));
setLength(dateAndTimeOfIssue, 8);
Move(DOIReversed, dateAndTimeOfIssue[0], SizeOf(DOIReversed));
// result of this byte array casted into hex string is
'0000313B23048B31' // which is correct
setlength(taxPayerId, 20);
taxPayerId := TEncoding.UTF8.GetBytes(F.MyCompany.taxpayerId);
// result of this byte array casted into hex string is
'303231313331363832' // and I need it to be
'0000000000000000000000303231313331363832'
На самом деле я пытаюсь добавить несколько массивов байтов в один конечный массив, который будет отправлен на смарт-карту, например, это всего лишь 2 массива (я использую шестнадцатеричные строки только для представления того, как выглядят байты, потому что у меня есть полный пример того, как это должно быть). Команды APDU странные, заранее спасибо.
Комментарии:
1. Не уверен, что полностью понимаю вашу просьбу… Может быть, то, что вы ищете, — это IntToHex(число, цифры)?
2. @fpiette Нет, я думаю, он ищет StringOfChar. Но реализация такой функции относительно тривиальна по сравнению с тем, с чем он работает. Он определенно не в себе. @q1werty : Кстати,
setlength(taxPayerId, 20)
это бессмысленно. Массив выделяется поTEncoding.UTF8.GetBytes
. Массив, выделенный SetLength, уничтожается сразу же после этого. Если только компилятору каким-то образом не удастся выполнить оптимизацию, которая предотвратит это… Но все же суть в том, что длина набора не нужна.3. Почему бы вам просто не установить сначала длину вашего конечного массива, а затем скопировать нужные данные с соответствующим смещением, чтобы сохранить начальные нули? Примечание.Вы также можете сначала заполнить массив с измененным размером нулями перед копированием данных, если это еще не сделано автоматически во время изменения размера. Я не привык работать с универсальными массивами.
4. Используйте
FillChar
для этого5. Может быть, мой вопрос был немного неясен, моя вина. Как сказал @fpiette, я определенно вышел за рамки своих возможностей здесь, все, что мне на самом деле было нужно, это простой буфер, как Том заявил в ответе ниже, я думаю, он просто сгорел. Спасибо, ребята.
Ответ №1:
Фактический идентификатор налогоплательщика, по-видимому, состоит из 9 символов: «021131682». Для общей длины 20 байт вам нужно сначала 11 нулевых байтов в ArrTaxPayerId
массиве. Таким образом, с BufferSize=20
помощью , StrTaxPayerId='021131682'
вы можете установить начальную длину ArrTaxPayerId
:
SetLength(ArrTaxPayerId, BufferSize - Length(StrTaxPayerId);
Теперь это будет содержать 11 нулевых байтов. Затем вы объединяете его с байтами фактического идентификатора налогоплательщика:
ArrTaxPayerId := ArrTaxPayerId TEncoding.UTF8.GetBytes(StrTaxPayerId);
Затем последним шагом является преобразование 20-байтового ArrTaxPayerId
представления в шестнадцатеричное BinToHex()
, для которого у вас уже есть код.
Когда я попробовал вышесказанное, я получил результат 0000000000000000000000303231313331363832
Комментарии:
1. Именно то, что мне было нужно, простое решение. Большое спасибо!