继ruakh的帖子here之后,我想确定以下代码段是否属于TLV或KLV编码类型:
interface
const
Lex_0: string[length('(EOF)')] ='(EOF)';
Lex_1: string[length('(Error)')] ='(Error)';
LexTable : array[0..114] of ^String = (
@Lex_0,
@Lex_1
)
答案 0 :(得分:2)
您的示例代码无效,因为您正在混合shortstring const
pointer
string
- 正如Rob在评论中所述。
你的代码与KLV和TLV编码无关。
这里可能是TLV编码的示例(我只显示字符串编码,但您可以添加其他类型):
type
TTLVType = (tlvUnknown, tlvString, tlvInteger);
function EncodeToTLV(const aString: WideString): TBytes;
var Len: integer;
begin
Len := length(aString)*2;
SetLength(result,Len+sizeof(TTLVType)+sizeof(integer));
Result[0] := ord(tlvString); // Type
PInteger(@Result[sizeof(TTLVType)])^ := Len; // Length
move(pointer(aString)^,Result[sizeof(TTLVType)+sizeof(integer)],Len); // Value
end;
function DecodeStringFromTLV(const aValue: TBytes): WideString;
begin
if (length(aValue)<3) or (aValue[0]<>ord(tlvString)) or
(PInteger(@aValue[sizeof(TTLVType)])^<>length(aValue)-sizeof(TTLVType)-sizeof(integer)) then
raise EXception.Create('Invalid input format');
SetString(result,PWideChar(@Result[sizeof(TTLVType)+sizeof(integer)]),PInteger(@aValue[sizeof(TTLVType)])^ div 2);
end;
我在这里使用WideString
,因为它可以安全地存储任何Unicode内容,即使是在Delphi 2009之前版本的编译器上也是如此。
您可以使用记录而不是我的指针算法:
type
TTLVHeader = packed record
ContentType: TTLVType;
ContentLength: integer;
Content: array[0..1000] of byte; // but real length will vary
end;
PTLVHeader = ^TTLVHeader;
function EncodeToTLV(const aString: WideString): TBytes;
var Len: integer;
begin
Len := length(aString)*2;
SetLength(result,Len+sizeof(TTLVType)+sizeof(integer));
with PTLVHeader(result)^ do
begin
ContentType := tlvString;
ContentLength := Len;
move(pointer(aString)^,Content,Len);
end;
end;
类似的编码可用于KLV,但在标题中添加整数键。
答案 1 :(得分:0)
据我所知,这只定义了两个常量(在这种情况下为Lex_0
和Lex_1
)并将它们放入一个名为LexTable
的数组中,这根本就没有编码
Lex_0: string // declares a string constant by the name of Lex_0
[length('(EOF)')] // specifies the length of the string, this is equivalent to [5] in this case
='(EOF)' // sets the constant to '(EOF)'
然后创建指向string的LexTable
指针数组,并将两个常量的地址放入数组中。