【问题标题】:Converting C strings to Pascal strings将 C 字符串转换为 Pascal 字符串
【发布时间】:2018-01-31 20:47:10
【问题描述】:

在将C字符串转换为Pascal字符串时,为什么原始字符串的长度应该小于或等于127而不是256?我知道无符号整数的范围为 0~256,有符号的整数范围为 -128~127,但 Pascal 字符串的第一个字符不是无符号的吗?

【问题讨论】:

  • I understand that an unsigned int ranges from 0~256..很可能,更广泛。
  • 谁说 127 或更少?维基百科说 255 en.wikipedia.org/wiki/String_(computer_science)#Length-prefixed
  • PC 上常见的 Pascal 早期实现存储了前面有单字节长度的字符串(这是无符号的,因此字符串的长度可以从 0 到 255)。这不是语言本身的限制。
  • “Pascal 字符串”不是标准化的,每个谈论 Pascal 字符串的人都在谈论一些稍微不同的东西。 我的 Pascal 字符串有 4 个字节大小。
  • 你从哪里得到这个数字 127?我不知道任何具有该限制的实现,除非您指的是所谓的计数字符串,但这些具有固定的、明确声明的大小,例如var x: string[31],大小可以是 1 到 255 之间的任何值。

标签: c string pascal


【解决方案1】:

您所指的 Pascal 字符串可能是旧 Pascal 中使用的字符串(在例如 Delphi 和 FreePascal 中称为 ShortString,这是当今最流行的 Pascal 实现)。它可以包含 255 个单字节字符(C 中的char)。 无需将其限制为 127 个字符

也许您在想 255 个字节只能包含 127 个 UTF-16 代码点。但是这些字符串在旧的 CP/M 和 DOS 时代很流行,当时还没有人对 Unicode 有任何了解,并且被制作为包含 ASCII 或“扩展 ASCII”(8 位,使用代码页)。 p>

但大多数现代 Pascal 实现允许您使用最大 2 GB 的字符串。在那里,长度指示器不再作为第一个元素存储,只是靠近文本数据。而现在,这些字符串中的大多数也可以包含 Unicode,可以是 UTF-16 也可以是 UTF-8,这取决于您选择的字符串类型(现代 Pascal 实现有几种 不同 用于不同目的的字符串类型,因此不再有一个单一的“Pascal 字符串类型”)。

某些语言确实能够限制ShortString 的大小,即所谓的“计数”字符串:

var
  s: string[18];

该字符串最多包含 18 个字节的文本数据和 1 个字节长度的数据(在索引 0 处)。这种较短的字符串可以用在记录中,所以它们不会变得太大。

【讨论】:

    【解决方案2】:

    FreePascal 的 wiki 有一个很棒的页面,显示了 Pascal(至少该实现)支持的所有字符串类型:http://wiki.freepascal.org/Character_and_string_types - 它包括长度前缀和空终止的字符串类型。该页面上的所有类型都没有 127 的长度限制。

    您所指的字符串类型将匹配具有单字节前缀的 ShortString,但他们的文档指出它接受 0-255。

    我知道一个字符串类型有一个 variable-length-integer 前缀,如果你希望内存中的表示是二进制兼容的,它会将字符串的长度限制为 127 个字符使用ShortString,因为128 个字符或更长会将MSB 位设置为1,这在可变长度整数中意味着整数至少是2 个字节而不是1 个字节。

    【讨论】:

    • 你知道哪个 Pascal 具有可变长度大小的“前缀”(大多数现代 Pascal 不再使用前缀)?
    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多