1

我有一个从 Python 2 转换的应用程序(其中字符串本质上是字节列表),并且我使用字符串作为方便的字节缓冲区。

我正在用 Boo 语言(类似 Python 的语法,在 .NET 上运行)重写其中的一些代码,并且发现这些字符串具有内在编码类型,例如 ASCII、UTF-8 等。大部分信息处理bytes 指的是字节数组,它们(显然)是固定长度的,这使得它们很难使用。

我显然可以从字符串中获取字节,但有可能将某些字符扩展为多个字节,或丢弃/更改 127 以上的字节等。这很好,我完全理解这样做的原因 - 但什么对我来说很方便要么是(a)一种保证不转换或丢弃字符的编码,因此我可以将字符串用作方便的字节缓冲区,或者(b)某种提供字符串类便利的 ByteString 类。(理想情况下是后者,因为它看起来不像黑客攻击。)其中任何一个已经存在吗?(或者实现起来很简单?)

我知道 System.IO.MemoryStream,但是每次都创建一个,然后不得不在最后创建一个 System.IO.StreamReader 只是为了访问 ReadToEnd() 似乎效率不高,而且这是在性能敏感的代码中。

(我希望没有人介意我将其标记为 C#,因为我觉得答案可能也适用于那里,并且 C# 用户可能对可能的解决方案有一个很好的了解。)

编辑:我也刚刚发现 System.Text.StringBuilder - 同样,字节有这样的东西吗?

4

2 回答 2

4

使用此答案中描述的 Latin-1 编码。它映射 128-255 范围内的值不变,当您想要将字节往返于字符时很有用。

更新

或者,如果您想直接操作字节,请使用List<byte>

List<byte> result = ...
...
// Add a byte at the end
result.Add(b);
// Add a collection of bytes at the end
byte[] bytesToAppend = ...
result.AddRange(bytesToAppend);
// Insert a collection of bytes at any position
byte[] bytesToInsert = ...
int insertIndex = ...
result.InsertRange(insertIndex, bytesToInsert);
// Remove a range of bytes
result.RemoveRange(index, count);
... etc ...

我也刚刚发现了 System.Text.StringBuilder - 同样,字节有这样的东西吗?

该类StringBuilder是必需的,因为常规字符串是不可变的,并且 aList<byte>为您提供了“StringBuilder for bytes”所期望的一切。

于 2011-04-21T17:01:15.360 回答
2

我建议您将 MemoryStream 与 GetBuffer() 运算符结合使用来检索最终结果。字符串实际上是固定长度且不可变的,要在字符串中添加或替换一个字节需要您将整个内容复制到一个新字符串中,这非常慢。为避免这种情况,您需要使用 StringBuilder 来分配内存并在需要时将容量加倍,但是您也可以使用 MemoryStream 代替它做类似的事情,但在字节上。

字符串中的每个元素都是一个字符,实际上是两个字节,因为 .NET 字符串在内存中始终是 UTF-16,这意味着如果您决定在每个元素中只存储一个字节,也会浪费内存。

于 2011-04-21T16:56:26.917 回答