Delphi 增量十六进制字符串
我试图增加一个十六进制字符串,如下所示: #$67#$1c#$87#$b1; #$67#$1c#$87#$b2; #$67#$1c#$87#$b3; 在此过程中,只有第二个字节增量。 结果是: #$67#$1D#$87#$B1 #$67#$1E#$87#$B1 #$67#$1F#$87#$B1 #$67#$1D#$87#$B1 #$67#$1E#$87#$B1 #$67#$1F#$87#$B1Delphi 增量十六进制字符串,delphi,Delphi,我试图增加一个十六进制字符串,如下所示: #$67#$1c#$87#$b1; #$67#$1c#$87#$b2; #$67#$1c#$87#$b3; 在此过程中,只有第二个字节增量。 结果是: #$67#$1D#$87#$B1 #$67#$1E#$87#$B1 #$67#$1F#$87#$B1 #$67#$1D#$87#$B1 #$67#$1E#$87#$B1 #$67#$1F#$87#$B1 谢谢如果要增加序列,应执行以下操作: move(Sequence[0], intSequence
谢谢如果要增加序列,应执行以下操作:
move(Sequence[0], intSequence, SizeOf(Cardinal));
inc(intSequence);
move(intSequence, Sequence[0], SizeOf(Cardinal));
您的代码不起作用,因为序列[1]指向序列的第二个字节(数组以0开头),序列和测试都由字节/字符组成,所以只传输1个字节
编辑:尝试此操作后,我看到intSequence是以“向后”字节顺序存储的,这会增加序列的第一个字节,因此您可能希望之前反转序列。这里有三个问题:
#$67#$1c#$87#$b1#$68#$1c#$87#$b1#$69#$1c#$87#$b1…
有关此问题的解决方案,请参阅您也可以通过创建“变体记录”并使用Inc()来实现这一点 在这种情况下,data和intSequence字段在内存中相互“覆盖”,因此对一个字段的任何写入都将立即反映在另一个字段中。警告,不是Delphi专家 不要进行字符串操作,也不要使用整数数组 你想要的是增加一个数字,那么就这样做吧!十六进制数表示单个整数,而不是整数数组
如果您的十六进制字符串太大,无法放入整数,那么继续使用整数数组,只需确保封装它,使其看起来像处理一种类型。然后您可以单独测试这个整数类型的数组我想我看到了这里真正的情况: 我相信这是德尔福2009。Char实际上是一个UnicodeChar,它是一个两字节的变量 增加第四个字节,你真正在改变什么?第二个字符的低位字节——正好产生所示的输出。如果你让它超过$FF,你会看到一个完全不同的结果
很抱歉,我无法提供更多信息,我还没有升级。IMO这是Pascal方式!为了挑剔,记录语法应该有paren:0:(数据:AnsiChar的数组[0..3];1:(整数序列:整数);由于endian游戏,顺序应该颠倒:sequence.data:=#$b1#$87#$1c#$67;showmessage(格式('%x',[sequence.intsequence]);您可以这样做:Sequence.data:=#$67#$1D#$87#$B1{未反转};Sequence.intSequence:=ntohl(Sequence.intSequence);ntohl可在Winsock单元中找到。另外一个好处是,代码只需重新构建就可以在非小endian处理器上运行。这是最好的版本!我知道在C语言中有联合,但我经常忘记在Delphi中也有类似的方法来实现这一点!您的解决方案非常有效,尤其是在使用ntohl函数时!感谢您的回复。最初,我使用的是字符串,没有更改字符数组的数组偏移量。只是一个错误。我的主要问题是endian的不确定性。我看了你的文章,现在一切都很好。谢谢
move(Sequence[0], intSequence, SizeOf(Cardinal));
inc(intSequence);
move(intSequence, Sequence[0], SizeOf(Cardinal));
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;