Delphi 增量十六进制字符串

Delphi 增量十六进制字符串,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

我试图增加一个十六进制字符串,如下所示:

#$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, SizeOf(Cardinal));
inc(intSequence);
move(intSequence, Sequence[0], SizeOf(Cardinal));
您的代码不起作用,因为序列[1]指向序列的第二个字节(数组以0开头),序列和测试都由字节/字符组成,所以只传输1个字节


编辑:尝试此操作后,我看到intSequence是以“向后”字节顺序存储的,这会增加序列的第一个字节,因此您可能希望之前反转序列。

这里有三个问题:

  • SizeOf(Sequence)不是序列的长度
  • 您将序列类型定义为[0..3],因此需要将索引启动为0
  • endian问题。在little endian机器上,即使索引和长度正确,也会得到
    #$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;