You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在设计时定义混合字节与字符串的常量字节数组?

Delphi常量字节数组设计时填充与运行时函数疑问解答

一、设计时用字符串替换常量字节数组的部分内容

在Delphi中,设计时(编译期)定义的常量字节数组,初始化值必须是编译期可计算的常量表达式。要使用字符串替换数组中的部分内容,有两种可行方式:

方式1:手动转换字符串为十六进制字节值

直接将目标字符串的每个字符转换为对应的ASCII十六进制字节,替换数组对应位置的值。例如'5381'对应的ASCII字节是$35('5')、$33('3')、$38('8')、$31('1'),替换后代码如下:

HeaderArray: array [0 .. 123] of Byte = ($01, $08, $5B, $08, $0A, $00,
    $97, $35, $33, $32, $38, $30, $2C, $30, $3A, $97, $35, $33, $38, $31);

这种方式适用于短字符串,所有值都是编译期常量,无运行时开销。

方式2:利用编译期字符串常量的字符值

若字符串较长,手动转换效率低,可定义常量字符串,通过Ord()函数取每个字符的ASCII值作为数组元素(仅适用于ANSI字符串/ASCII字符场景):

const
  ReplaceStr = '5381';
  HeaderArray: array [0 .. 123] of Byte = ($01, $08, $5B, $08, $0A, $00,
    $97, $35, $33, $32, $38, $30, $2C, $30, $3A, $97, 
    Ord(ReplaceStr[1]), Ord(ReplaceStr[2]), Ord(ReplaceStr[3]), Ord(ReplaceStr[4]));

注意:Delphi字符串为1-based索引,且ReplaceStr必须是长度固定的常量字符串,确保编译期能计算Ord()结果。若涉及Unicode编码转换(非ASCII字符),此方式不适用,需手动写入目标编码对应的字节值。

二、TEncoding.Default.GetBytes与BytesOf的属性

这两个函数都属于运行时函数,无法在编译期使用:

  • TEncoding.Default.GetBytes:依赖TEncoding类的运行时实例化,字符串到字节的编码转换逻辑需在运行时执行,编译器无法在编译期计算其返回值。
  • BytesOf:本质是封装了TEncoding.Default.GetBytes的调用,同样依赖运行时编码处理逻辑,因此也属于运行时函数。

它们不能用于常量字节数组的初始化表达式,仅能在运行时动态修改字节数组。

内容的提问来源于stack exchange,提问作者Pontus Berg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 22:45:58