Массив байтов Delphi с начальными нулями (?пустой? пробелы в массиве)

#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. Именно то, что мне было нужно, простое решение. Большое спасибо!