D:将ubyte []解码为string,redux

时间:2015-12-19 05:13:35

标签: string zip d decode bytestream

这个问题是上一个问题的改进版本:

how to decode ubyte[] to a specified encoding?

我正在寻找一种惯用的方式将ubyte[]属性返回的std.zip.ArchiveMember.expandedData数组转换为字符串或其他可范围的字符串集合...或者整个内容类似调用File.open("file"),或以与File.open("file").byLine()类似的方式迭代的东西。

到目前为止,我从处理字符数组或字符串的标准文档中找到的所有内容都不支持ubyte[]参数,而且关于D&#zip文件处理的示例非常简陋,仅处理从zip存档及其成员文件中获取原始数据...没有明显的文件/流/ io接口,能够轻松地在原始字节流和面向文本的文件/字符串操作之间进行分层。

我认为我可以在std.utfstd.uni中找到解码单个代码点的内容,并且在循环中通过字节流进行/ for循环,但肯定可能有更好的方法吗?

代码示例:

std.zip.ZipArchive zipFile;
// just humor me, this is what I've been given.
zipFile = new std.zip.ZipArchive("dataSet.csv.zip");
foreach(memberFile; zipFile.directory)
{
    zipFile.expand(memberFile);
    ubyte[] uByteArray = memberFile.expandedData;

    // ok, now what?
    // is there a relatively simplistic way to get this
    // decoded/translated byteStream into a string
    // or collection of strings(for example, one string per line
    // of the compressed file) ?

    string completeCsvContents = uByteArray.PQR();
    string[] csvRows = uByteArray.XYZ();
}

我可以轻松填写​​PQR或XYZ吗?

或者,如果是以

的方式进行API调用的问题
string csvData = std.ABC.PQR(uByteArray)

ABC / PQR会是什么?

2 个答案:

答案 0 :(得分:1)

也许只是做

auto stuff = cast(char[]) memberFile.expandedData; 

使用结果char[] stuff时,无论如何都将自动解码,例如通过将char[] stuff作为输入范围传递时调用范围基元的函数。

因为实际上char[]string都没有被解码。只有dchar[]dstring

答案 1 :(得分:1)

如果您知道字符串是UTF-8编码的,则可以使用std.string.assumeUTF将其转换为字符串/ char数组。所有这些都是一个演员,如嵌套类型所提到的,但它的模式是自我记录。

如果您需要确保生成的字符串实际上是有效的UTF-8(因为有几个操作在无效字符串上有未定义的行为),那么您可以使用std.utf.validateassumeUTF也在调试版本下执行此操作。