gpt4 book ai didi

在 C 和 Delphi 中将字节数组转换为 2 unsigned long

转载 作者:行者123 更新时间:2023-11-30 15:24:59 26 4
gpt4 key购买 nike

以下 C 代码:

typedef unsigned char byte;

byte temp[8] = {...};

unsigned long iONE = 0;
unsigned long iTWO = 0;

memcpy(((byte *)&iONE)+sizeof(unsigned long)-4, temp, 4);
memcpy(((byte *)&iTWO)+sizeof(unsigned long)-4, temp+4, 4);

+sizeof(unsigned long)-4的意义是什么?

memcpy语句可以写成:

memcpy((byte *)&iONE, temp, 4);
memcpy((byte *)&iTWO, temp+4, 4);

Delphi 转换是否有效:

var
temp: array[0..7] of Byte;
iONE: Cardinal;
iTWO: Cardinal;
begin
temp := ...;
iONE := 0;
iTWO := 0;

CopyMemory(iOne, temp[0], SizeOf(Cardinal));
CopyMemory(iTwo, temp[4], SizeOf(Cardinal));
end;

最佳答案

(byte *)&iONE)+sizeof(unsigned long)-4

正在尝试从iONE读取4个字节,但也考虑了unsigned long大于4个字节的可能性。该代码通过选取 iONE 的最后 4 个字节来实现这一点。由于代码总是从变量的同一端读取,因此它的行为在小端机和大端机之间有所不同。在没有任何上下文的情况下,很难说出这段代码想要实现的目标,但我的猜测是它最初运行在具有 8 字节 unsigned long 的大端系统上。或许你知道的更多。

在 Delphi 中你可能会这样写。

var
temp: array[0..7] of Byte;
iONE: Cardinal;
iTWO: Cardinal;
begin
temp := ...;
iONE := PCardinal(@temp[0])^;
iTWO := PCardinal(@temp[4])^;;
end;

但是,了解更多有关原始代码的信息会有所帮助。就我个人而言,如果我面临这个任务,我会从头开始编写代码,而不是进行文字移植。原始代码看起来已经很糟糕了,一旦翻译过来,情况会更糟。弄清楚代码的作用,并使用目标语言的习惯用法编写一个新程序。

代码中的两个小点:

  1. 初始化一个立即被覆盖的变量是没有意义的。这只会让 future 的读者感到困惑。
  2. CopyMemory 是 Windows API 函数,因此不可移植。 System.Move 是用于原始内存复制的函数。

关于在 C 和 Delphi 中将字节数组转换为 2 unsigned long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28131979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com