Delphi实现TLV编码时十六进制字符串转TBytes数组方法咨询
实现方案
你当前场景下的两个十六进制字符串均为固定2位、取值不超过0xFF,对应单个字节,所以可以按以下方式实现转换和数组合并:
方案1:针对当前场景的简化实现(推荐)
你甚至可以跳过「转十六进制字符串再转字节」的中间步骤,直接从原始数值生成字节,效率更高:
var TLVArr: TBytes; ValueLen: Integer; begin ValueLen := Length(TagValue); // 直接从原始数值转字节,省去字符串转换开销 SetLength(TLVArr, 2 + ValueLen); TLVArr[0] := Byte(TagNum); // Tag占1字节 TLVArr[1] := Byte(ValueLen); // Length占1字节 // 复制Value的UTF8字节数组 if ValueLen > 0 then Move(TEncoding.UTF8.GetBytes(TagValue)[0], TLVArr[2], ValueLen); end;
方案2:按你现有代码逻辑,十六进制字符串转字节后合并
如果必须基于已生成的TagBuf、TagValueLenBuf两个十六进制字符串处理,可以用以下方法:
首先实现2位十六进制字符串转单字节的逻辑:
function TwoCharHexToByte(const HexStr: string): Byte; begin // 输入为合法2位十六进制字符,直接加$前缀转整数再转字节 Result := StrToInt('$' + HexStr); end;
然后合并得到完整TLV字节数组:
var TLVArr: TBytes; TagByte, LenByte: Byte; ValueArrLen: Integer; begin TagByte := TwoCharHexToByte(TagBuf); LenByte := TwoCharHexToByte(TagValueLenBuf); ValueArrLen := Length(TagValueBufArr); // 分配数组空间:1字节Tag + 1字节Length + Value字节长度 SetLength(TLVArr, 2 + ValueArrLen); TLVArr[0] := TagByte; TLVArr[1] := LenByte; if ValueArrLen > 0 then Move(TagValueBufArr[0], TLVArr[2], ValueArrLen); end;
通用扩展:任意长度十六进制字符串转TBytes
如果后续需要处理更长的十六进制字符串,可以用这个通用函数:
function HexStrToTBytes(const Hex: string): TBytes; var i: Integer; begin Assert(Length(Hex) mod 2 = 0, '十六进制字符串长度必须为偶数'); SetLength(Result, Length(Hex) div 2); for i := 0 to High(Result) do Result[i] := StrToInt('$' + Copy(Hex, i*2 + 1, 2)); end;
内容的提问来源于stack exchange,提问作者Ammar
相关产品推荐
相关产品推荐

