处理字节的无编码字符串类?(或替代方法)

本文关键字:方法 字节 编码 字符串 编码字符 处理 | 更新日期: 2023-09-27 17:52:50

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

我正在用Boo语言(类似python的语法,在。net上运行)重写一些代码,并发现字符串具有内在的编码类型,例如ASCII, UTF-8等。处理字节的大多数信息都是指字节数组,这些字节数组(显然)是固定长度的,这使得它们的使用相当尴尬。

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

我知道System.IOMemoryStream,但是每次创建一个这样的对象,然后不得不在最后创建一个System.IO.StreamReader来访问ReadToEnd(),这似乎不是很有效,而且这是在性能敏感的代码中。

(我希望没有人介意我把这个标记为c#,因为我觉得答案可能也适用于那里,c#用户可能对可能的解决方案有一个很好的想法。)

编辑:我也刚刚发现了System.Text.StringBuilder -再一次,有这样的事情为字节?

处理字节的无编码字符串类?(或替代方法)

使用本答案中描述的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类是需要的,因为常规字符串是不可变的,而List<byte>给你一切你可能期望从"StringBuilder for bytes"

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

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