Delphi XE3 - >整数到字节数组

Mic*_*zer 5 arrays delphi byte integer

我有一个数据结构:

data = array of integer;
Run Code Online (Sandbox Code Playgroud)

我已经把它填满了

source = array of byte;
Run Code Online (Sandbox Code Playgroud)

data[x] := Source[offset] or (Source[offset + 1] shl 8) or
    (Source[offset + 2] shl 16) or (Source[offset + 3] shl 24);
Run Code Online (Sandbox Code Playgroud)

在处理完这些块之后,我必须将它们带回"字节"......

任何的想法?

Dav*_*nan 7

您可以使用Move在单行中执行此操作.

Move(source[0], dest[0], Length(source)*SizeOf(source[0]));
Run Code Online (Sandbox Code Playgroud)

如果您需要执行网络/主机字节顺序转换,那么您可以在之后运行整数数组Move.

在相反的方向,你反过来完成所有这一切.

如果您没有字节顺序问题,那么您可能根本不需要转换为字节数组.您可以按原样使用整数数组.请记住,没有字节顺序问题,字节和整数数组的内存布局是相同的(这就是你能够blit的原因Move).


And*_*and 6

你的意思是这样的?

var
  i: integer;
  b1, b2, b3, b4: byte;
begin
  b1 := byte(i);
  b2 := byte(i shr 8);
  b3 := byte(i shr 16);
  b4 := byte(i shr 24);
Run Code Online (Sandbox Code Playgroud)

比如试试吧

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
  b1, b2, b3, b4: byte;
begin
  i := $AABBCCDD;
  b1 := byte(i);
  b2 := byte(i shr 8);
  b3 := byte(i shr 16);
  b4 := byte(i shr 24);
  ShowMessage(IntToHex(b1, 2));
  ShowMessage(IntToHex(b2, 2));
  ShowMessage(IntToHex(b3, 2));
  ShowMessage(IntToHex(b4, 2));
end;
Run Code Online (Sandbox Code Playgroud)


Rud*_*uis 6

嗯......我看到一个使用Move的答案和一个使用轮班的答案,但是一个简单的演员怎么样?:

var
  I: Integer;
  B: array[0..3] of Byte;
begin
  // from bytes to integer:
  I := PInteger(@B)^;
  // from integer to bytes:
  PInteger(@B)^ := I;
Run Code Online (Sandbox Code Playgroud)

或者使用您的数组:

data[i] := PInteger(@source[offset])^;
Run Code Online (Sandbox Code Playgroud)

反之亦然:

// get low byte
source[offset] := PByte(@data[i])^; // or := PByte(@data[i])[0];
// get second byte
secondByte := PByte(@data[i])[1]; // or := (PByte(@data[i]) + 1)^;
Run Code Online (Sandbox Code Playgroud)

要么

PInteger(@source[offset])^ := data[i];
Run Code Online (Sandbox Code Playgroud)

如你所见,通过转换为指针可以获得很长的路要走.这实际上并不占用指针,编译器足够聪明,可以直接访问项目.