Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取UTF8编码文件时的大小差异_C#_Encoding_Utf 8 - Fatal编程技术网

C# 读取UTF8编码文件时的大小差异

C# 读取UTF8编码文件时的大小差异,c#,encoding,utf-8,C#,Encoding,Utf 8,我正在尝试读取UTF8编码的文件(.torrent)。文件中有一个“片段”部分。紧随其后的是包含SHA1哈希序列的文本长度。该文件报告了要读取的长度(比如130100),但在读取时,我最终通过了EOF 我不知道为什么会这样。这些文件都很好(我已经用现有的torrent客户端对它们进行了测试,并尝试了许多具有一致结果的文件),我用以下内容阅读它们: string contents = string.Empty; using (FileStream fs = new FileStream(path,

我正在尝试读取UTF8编码的文件(.torrent)。文件中有一个“片段”部分。紧随其后的是包含SHA1哈希序列的文本长度。该文件报告了要读取的长度(比如130100),但在读取时,我最终通过了EOF

我不知道为什么会这样。这些文件都很好(我已经用现有的torrent客户端对它们进行了测试,并尝试了许多具有一致结果的文件),我用以下内容阅读它们:

string contents = string.Empty;
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)
{
    using (StreamReader reader = new StreamReader(fs, Encoding.UTF8))
    {
        contents = reader.ReadToEnd();
    }
}

parse(contents);

然而,这显然不起作用。我是否读取了错误的文件,或者在试图解析它之前是否将其错误地存储在字符串中?它似乎只有在读取超出正常可读字符串范围的字符时才会出错。

BitTorrent文件不是UTF-8编码的。
文件->路径
/
名称
属性中的部分或全部文件名可能是UTF-8编码字符串,但整个文件是纯二进制的,
片段
属性的内容是包含哈希的二进制字符串。尝试使用
文本阅读器阅读.torrent是没有意义的


BitTorrent文件的存储格式是一种简单的结构化值序列化,称为。您需要使用适当的bencode解析器从.torrent文件中提取信息。编写一个(毕竟,您只得到四个数据类型)或查看两个现有的.NET库并不困难。

BitTorrent文件不是UTF-8编码的。
文件->路径
/
名称
属性中的部分或全部文件名可能是UTF-8编码字符串,但整个文件是纯二进制的,
片段
属性的内容是包含哈希的二进制字符串。尝试使用
文本阅读器阅读.torrent是没有意义的


BitTorrent文件的存储格式是一种简单的结构化值序列化,称为。您需要使用适当的bencode解析器从.torrent文件中提取信息。编写一个(毕竟,您只得到四个数据类型)或查看几个现有的.NET库并不困难。

您如何知道您正在阅读EOF之后的内容?
ReadToEnd
是否正在引发异常?如果是这样,怎么办?为什么不在长度输入后打印文件位置,然后在十六进制编辑器中检查剩余长度?然后你会看到文件是否正确(因此你的代码也不正确)。@Michael Petrotta。我的错误;我应该澄清:我没有读取通过的EOF,但是torrent文件中“片段”的给定长度超过了我从文件中读取的剩余内容的长度。你怎么知道你读取的是通过EOF的?
ReadToEnd
是否正在引发异常?如果是这样,怎么办?为什么不在长度输入后打印文件位置,然后在十六进制编辑器中检查剩余长度?然后你会看到文件是否正确(因此你的代码也不正确)。@Michael Petrotta。我的错误;我应该澄清:我没有读取通过的EOF,但torrent文件中“片段”的给定长度超过了我从该文件中读取的剩余内容的长度。我已经编写了一个实现,可以在bencoding中对字符串进行编码和解码。这就是我正在测试的。我可以成功解码整个.torrent文件,但有1个例外。我不想使用现有的库(链接的库不是.NET的n/a,就是需要我dl/install git才能获得)。谢谢你的回答,但这对我没有帮助。另外,也许你可以澄清一下:考虑到文件的其余部分不是问题,只有这一部分。该规范定义了“片段映射到长度为20倍的字符串”和“包含文本的.torrent文件中的所有字符串都必须是UTF-8编码的”为什么使用StreamReader是不明智的?但并非所有字符串都“包含文本”<代码>片段
,尤其不会。这是一个字节字符串,表示二进制哈希,而不是文本字符,几乎永远不会形成有效的UTF-8序列。您必须将其解析为
字节[]
结构,而不是
字符串。不幸的是,bencode格式没有告诉您哪些字符串是二进制的,哪些“包含文本”(主要是因为该格式最初设计时没有Unicode的概念),这使得您不得不为所有内容返回
字节[]
。(考虑到在野外.torrent文件中表面上的文本字符串字段实际上仍然包含UTF-8以外的编码字符的频率,这不是一个坏主意。)我已经编写了一个实现,可以在bencoding中对字符串进行编码和解码。这就是我正在测试的。我可以成功解码整个.torrent文件,但有一个例外。我不想使用现有的库(链接的库不是.NET的n/a,就是需要我dl/install git才能获得)。谢谢你的回答,但这对我没有帮助。此外,也许你可以澄清一下:鉴于文件的其余部分不是问题,所以只有其中的这一部分。规范定义了“片段映射到长度为20倍的字符串”和“包含文本的.torrent文件中的所有字符串都必须是UTF-8编码的”为什么使用StreamReader是不明智的?但并非所有字符串都“包含文本”。尤其是
片段不会。这是一个字节字符串,表示二进制哈希,而不是文本字符,几乎永远不会形成有效的UTF-8序列。您必须将其解析为
字节[]
结构,而不是
字符串
。不幸的是,bencode格式无法告诉您哪些字符串是二进制的,哪些“包含文本”(主要是因为该格式最初设计时没有Unicode的概念),这使得您不得不为所有内容返回
字节[]
。(考虑到在野外.torrent文件中表面上的文本字符串字段实际上仍然包含编码字符的频率,这不是一个坏主意