【问题标题】:Delphi byte array leading zeroes (?empty? spaces in array)Delphi 字节数组前导零(?空?数组中的空格)
【发布时间】:2021-11-26 16:23:48
【问题描述】:

我正在尝试为每个缺少的字节数组元素添加 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'

我实际上想要实现的是将多个字节数组添加到将发送到 SmartCard 的最终数组中,例如,这些只是此处的 2 个数组(我使用十六进制字符串仅表示字节的样子因为我有一个完整的例子说明它应该是怎样的)。 APDU 命令很奇怪,在此先感谢。

【问题讨论】:

  • 不确定我是否完全理解您的要求...也许您正在寻找的是 IntToHex(Number, Digits)?
  • @fpiette Nah,我认为他正在寻找 StringOfChar。但与他正在使用的功能相比,实现这样的功能相对微不足道。他绝对超出了他的深度。 @q1werty:顺便说一句,setlength(taxPayerId, 20) 毫无意义。该数组由TEncoding.UTF8.GetBytes 分配。 SetLength 分配的数组在之后立即被销毁。除非编译器以某种方式设法进行优化以防止这种情况发生......但是,重点是,SetLength 是不必要的。
  • 为什么不先简单地设置最终数组的长度,然后用适当的偏移量复制所需的数据以保留前导零?请注意,如果在调整大小期间尚未自动执行此操作,则您也可以在复制数据之前先用零填充调整大小的数组。我不习惯使用泛型数组。
  • 为此使用FillChar
  • 也许我的问题有点不清楚,我的错。正如@fpiette 所说,我在这里绝对超出了我的范围,我真正需要的只是一个简单的缓冲区,正如汤姆在下面的回答中所说,我猜只是烧坏了。谢谢你们。

标签: arrays delphi hex apdu


【解决方案1】:

实际的纳税人 ID 似乎是 9 个字符:'021131682'。对于 20 字节的总长度,您首先需要在 ArrTaxPayerId 数组中使用 11 个空字节。所以,BufferSize=20,StrTaxPayerId='021131682'可以设置ArrTaxPayerId的初始长度:

SetLength(ArrTaxPayerId, BufferSize - Length(StrTaxPayerId);

现在将包含 11 个空字节。然后将其与实际纳税人 ID 的字节连接起来:

ArrTaxPayerId := ArrTaxPayerId + TEncoding.UTF8.GetBytes(StrTaxPayerId);

最后一步是使用您已经拥有代码的BinToHex() 将 20 字节 ArrTaxPayerId 转换为十六进制表示。

当我尝试上述方法时,我得到了0000000000000000000000303231313331363832的结果

【讨论】:

  • 正是我需要的,简单的解决方案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多