【问题标题】:Does Delphi and FPC have MakeWord functions (out of two bytes or chars)?Delphi 和 FPC 是否具有 MakeWord 函数(两个字节或字符)?
【发布时间】:2017-07-01 13:17:39
【问题描述】:

这些功能很有用:

function MakeWord(low, high: char): word;
begin
  result := byte(high) shl 8 + byte(low);
end; 

function MakeWord(low, high: byte): word;
begin
  result := high shl 8 + low;
end; 

但是我想知道这些类型的函数(可以以不同的方式实现)是否已经存在于某个地方(不是在 windows api 特定文件中,而是在跨平台 RTL 函数中)。

示例用例:取两个字符 GT 并从中得出 WORD 结果。

MakeWord('G','T');

我发现这比在代码中插入 SHL/SHR AND/OR 十六进制操作和其他不描述代码在做什么的黑客行为更具可读性......所以这些函数肯定已经存在于某个地方吗?还是人们会在他们的应用程序中自行开发?

或者类似的东西:

var x: word;
begin
  lo(x) := byte('G');
  hi(x) := byte('T');
end;

但是,这不起作用,因为左侧无法分配给:但它比其他一些解决方案更具可读性,IMO。

我想我也见过 LoWord 和 HiWord 函数(或 LoByte、HiByte),但通常是在只读情况下。给hi和lo写信怎么样?

【问题讨论】:

  • 你知道Char的大小吗?
  • @MBo:我猜Byte() 的演员阵容解决了这个问题。
  • @Rudy Velthuis 这个演员表隐藏了潜在的问题(信息丢失),没有完全解决它
  • @MBo:在大端平台上,确实是个问题。
  • MBo,怎样才能完全解决它?感谢您的注意。此外,在 Remy 的回答中,他使用了 Ord() 和 Byte() (两个演员表)......这些是我希望编程语言可以避免的那些讨厌的事情。事实上,演员表的使用是第一个警告,有些事情可能不正确。在 wiki 上,有人曾经说过演员表是谎言的开始。

标签: delphi bit-manipulation bit-shift word freepascal


【解决方案1】:

Delphi 和 FreePascal 在SysUtils 单元中都有一个WordRec 记录:

德尔福:http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.WordRec

FreePascal:https://www.freepascal.org/docs-html/rtl/sysutils/wordrec.html

例如:

uses
 ..., SysUtils;

var
  x: Word;
begin
  WordRec(x).Lo := Byte(Ord('G'));
  WordRec(x).Hi := Byte(Ord('T'));
end;

【讨论】:

  • 感谢您的回答:请注意:您需要使用 ord 和 byte 转换两次,还是只使用 byte() 转换,然后完全跳过 ord?
  • @OverflowingHuman 取决于编译器。由于在 Delphi 2009+ 中字符是 2 字节 WideChar,因此您通常需要 Ord 将它们作为序数值使用。额外的 Byte 演员表更明确地说明了分配的内容。使代码更具自我记录性并避免任何歧义。
【解决方案2】:

是的,FreePascal 在 windows 单元中有 makeword。(makeword 最初是一个 winapi 宏 IIRC)

此外,它还具有内联功能,可优化此类小型函数的调用开销。

【讨论】:

  • Delphi 也一样。
  • 是的,但它是一个 Windows 宏,在 Windows 单元中。该问题专门要求跨平台解决方案。
  • 我错过了。如果计算 bigendian 目标,则跨平台性是高度特定于应用程序的。
  • 跨平台函数不能为所有平台提供 ifdef ......我怀疑 sysutils WordRec 可能已经实现了这个(见 Remy 的回答)?
  • makeword 本身对字节序不敏感,但它的用法可能是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多