增量十六进制字符串

时间:2009-03-06 21:58:33

标签: delphi

我正在尝试增加这样的十六进制字符串:

#$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 

由于

5 个答案:

答案 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)

这里有三个问题:

  1. SizeOf(Sequence)不是序列的长度。
  2. 您将序列类型定义为[0..3],因此需要将索引作为0
  3. 启动
  4. endian问题。在小端机器上,即使您正确地执行索引和长度,您也会得到#$67#$1c#$87#$b1 #$68#$1c#$87#$b1 #$69#$1c#$87#$b1 ...要解决此问题,请参阅this article

答案 3 :(得分:1)

警告,不是Delphi专家

不要进行字符串操作,也不要使用整数数组。

你想要的是增加一个数字,所以这样做!十六进制数表示单个整数,而不是整数数组。

  1. 将十六进制字符串转换为整数
  2. 增量整数
  3. 将整数转换为十六进制字符串
  4. 不要抱怨我这是低效的,它是正确的,简单明了的。这就是代码应该如何。

    如果你的十六进制字符串太大而不适合整数,那么继续使用一个整数数组,只需确保封装它,这样看起来就像你处理一种类型。然后,您可以单独测试此整数类型数组

答案 4 :(得分:1)

我想我知道这里到底发生了什么:

我相信这是Delphi 2009.Char实际上是一个UnicodeChar,它是一个 TWO 字节变量。

增加第4个字节,你真正改变了什么?第二个字符的低位字节 - 产生完全显示的输出。如果你让它超过$ FF你会看到一个非常不同的结果!

抱歉,我无法提供更多信息,我还没有升级。