Delphi 字节数组前导零(?空?数组中的空格)
Delphi byte array leading zeroes (?empty? spaces in array)
我正在尝试为每个缺少的字节数组元素添加 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 命令很奇怪,提前致谢。
实际纳税人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
的结果
我正在尝试为每个缺少的字节数组元素添加 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 命令很奇怪,提前致谢。
实际纳税人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