【发布时间】: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 所说,我在这里绝对超出了我的范围,我真正需要的只是一个简单的缓冲区,正如汤姆在下面的回答中所说,我猜只是烧坏了。谢谢你们。