【问题标题】:FileStream and Encoding文件流和编码
【发布时间】:2010-03-03 22:20:31
【问题描述】:

我有一个程序使用 stdio 接口写入保存文本文件。它将 4 MSB 与 4 LSB 交换,除了字符 CR 和/或 LF。

我正在尝试使用 C# 程序“解码”此流,但无法获取原始字节。

        StringBuilder sb = new StringBuilder();
        StreamReader sr = new StreamReader("XXX.dat", Encoding.ASCII);
        string sLine;

        while ((sLine = sr.ReadLine()) != null) {
            string s = "";
            byte[] bytes = Encoding.ASCII.GetBytes(sLine);

            for (int i = 0; i < sLine.Length; i++) {
                byte c = bytes[i];
                byte lb = (byte)((c & 0x0F) << 4), hb = (byte)((c & 0xF0) >> 4);
                byte ascii = (byte)((lb) | (hb));

                s += Encoding.ASCII.GetString(new byte[] { ascii });
            }
            sb.AppendLine(s);
        }
        sr.Close();

        return (sb);

我尝试更改 UTF8 中的编码,但没有成功。我还使用了使用 'sr' StreamReader 创建的 BinaryReader,但没有发生任何好事。

     StringBuilder sb = new StringBuilder();
        StreamReader sr = new StreamReader("XXX.shb", Encoding.ASCII);
        BinaryReader br = new BinaryReader(sr.BaseStream);
        string sLine;
        string s = "";

        while (sr.EndOfStream == false) {
            byte[] buffer = br.ReadBytes(1);
            byte c = buffer[0];
            byte lb = (byte)((c & 0x0F) << 4), hb = (byte)((c & 0xF0) >> 4);
            byte ascii = (byte)((lb) | (hb));

            s += Encoding.ASCII.GetString(new byte[] { ascii });
        }
        sr.Close();

        return (sb);

如果文件以 0xF2 0xF2 ... 开头,我会读取除预期值之外的所有内容。错误在哪里? (即:0xF6 0xF6)。

实际上这个 C 代码可以完成这项工作:

            ...
while (fgets(line, 2048, bfd) != NULL) {
    int cLen = strlen(xxx), lLen = strlen(line), i;

    // Decode line
    for (i = 0; i < lLen-1; i++) {
        unsigned char c = (unsigned char)line[i];
        line[i] = ((c & 0xF0) >> 4) | ((c & 0x0F) << 4);
    }

    xxx = realloc(xxx , cLen + lLen + 2);
    xxx = strcat(xxx , line);
    xxx = strcat(xxx , "\n");
}
fclose(bfd);

C# 代码有什么问题?

【问题讨论】:

    标签: c# text character-encoding


    【解决方案1】:

    知道了。

    问题在于 BinaryReader 构造:

    StreamReader sr = new StreamReader("XXX.shb", Encoding.ASCII);
    BinaryReader br = new BinaryReader(sr.BaseStream);
    

    我认为这构造了一个基于 StreaReader 的 BinaryReader,它“翻译”来自文件的字符。

    使用这段代码,实际上效果很好:

    FileInfo fi = new FileInfo("XXX.shb");
    BinaryReader br = new BinaryReader(fi.OpenRead());
    

    我想知道是否可以使用文本流阅读器逐行读取这些数据,因为在“编码”阶段会保留行尾。

    【讨论】:

    • 在将文件视为“哑”字节时,行尾不必有意义,因此我认为您不必在 BinaryReader 中支持“行读”。但这对你来说真的是个问题吗?如果您仍然想“解码”整个文件,那么逐行执行它没有多大意义。
    【解决方案2】:

    我猜你应该使用 BinaryReader 和 ReadBytes(),然后只在交换位后对字节序列使用 Encoding.ASCII.GetString()。

    在您的示例中,您似乎将文件读取为 ascii(意思是,您在读取时将字节转换为 .NET 内部双字节代码,告诉它它是 ascii),然后将其再次转换回字节,作为 ascii-字节。

    这对你来说是不必要的。

    【讨论】:

    • 即使使用 BinaryReader 也无法获得正确的结果。 :((见编辑)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多