D 语言记录分隔符在字符串转换后丢失

D lang record separator is being lost after string cast

我正在打开一个 .gz 文件并逐块读取它以解压缩它。

解压文件中的数据如下: aRSbRScRSd,每条记录(我的虚拟示例 a、b、c 中的记录)之间有记录分隔符(ASCII 代码 30)。

    File file = File(mylog.gz, "r");
    auto uc = new UnCompress();
    foreach (ubyte[] curChunk; file.byChunk(4096*1024))  
    { 
        auto uncompressed = cast(string)uc.uncompress(curChunk);
        writeln(uncompressed);
        auto stringRange = uncompressed.splitLines();
        foreach (string line; stringRange)
        {
            ***************** Do something with line 

上面代码的结果是: abcd 不幸的是记录分隔符(ASCII 30)丢失了。

在将 ubyte[] 转换为字符串后,我通过检查数据记录分隔符发现丢失了。

现在我有两个问题:

编辑

第一个问题的更通用和更容易理解的代码:

    ubyte[] temp = [ 65, 30, 66, 30, 67];
    writeln(temp);
    string tempStr = cast(string) temp;
    writeln (tempStr);

结果是:不想要的 ABC。

字符 30 不是可打印字符,尽管某些编辑器可能会在其位置显示一个符号。它不会丢失,但不会打印出来。 另请注意,将 ubyte[] 转换为 string 通常是不正确的,因为 ubyte[] 数组是可变的,而 string 是不可变的。最好将 ubyte[] 转换为 char[].