我正在尝试增加这样的十六进制字符串:
#$67#$1c#$87#$b1; #$67#$1c#$87#$b2; #$67#$1c#$87#$b3;
这是我的程序:
var test : array [0..3] of char; intSequence : cardinal;
Sequence := #$67#$1c#$87#$b1;
procedure IncSequence;
begin
move(Sequence[1],intSequence,SizeOF(Sequence));
inc(intSequence);
move(intSequence,Sequence[1],SizeOf(test));
end;
这个过程只有第二个字节递增。 结果是:
#$67#$1D#$87#$B1 #$67#$1E#$87#$B1 #$67#$1F#$87#$B1
由于
答案 0 :(得分:7)
您也可以通过创建“变体记录”并使用Inc();
来完成此操作type
testrec = record
case Byte of
0: (data: array[0..3] of AnsiChar);
1: (intSequence: Integer);
end;
var
Sequence: testrec;
begin
Sequence.data = #$b1#$87#$1c#$67; // reversed because of "endian-ness"
Inc(Sequence.intSequence);
end;
在这种情况下,数据和intSequence字段在内存中相互“叠加”,因此对一个字段的任何写入都会立即反映在另一个字段中。
答案 1 :(得分:1)
如果要增加序列,则应执行以下操作:
move(Sequence[0], intSequence, SizeOf(Cardinal));
inc(intSequence);
move(intSequence, Sequence[0], SizeOf(Cardinal));
您的代码不起作用,因为Sequence [1]指向Sequence的第二个字节(数组以0开头),Sequence和test都包含字节/字符,因此只传输1个字节。
编辑:尝试之后,我看到intSequence以“向后”字节顺序存储,这会增加Sequence的第一个字节,所以你可能想要在之前反转Sequence。
答案 2 :(得分:1)
这里有三个问题:
#$67#$1c#$87#$b1 #$68#$1c#$87#$b1 #$69#$1c#$87#$b1 ...
要解决此问题,请参阅this article 答案 3 :(得分:1)
警告,不是Delphi专家
不要进行字符串操作,也不要使用整数数组。
你想要的是增加一个数字,所以这样做!十六进制数表示单个整数,而不是整数数组。
不要抱怨我这是低效的,它是正确的,简单明了的。这就是代码应该如何。
如果你的十六进制字符串太大而不适合整数,那么继续使用一个整数数组,只需确保封装它,这样看起来就像你处理一种类型。然后,您可以单独测试此整数类型数组
答案 4 :(得分:1)
我想我知道这里到底发生了什么:
我相信这是Delphi 2009.Char实际上是一个UnicodeChar,它是一个 TWO 字节变量。
增加第4个字节,你真正改变了什么?第二个字符的低位字节 - 产生完全显示的输出。如果你让它超过$ FF你会看到一个非常不同的结果!
抱歉,我无法提供更多信息,我还没有升级。