C#将字节[]转换为字符串[]

C#将字节[]转换为字符串[],c#,fixed,unsafe,reinterpret-cast,C#,Fixed,Unsafe,Reinterpret Cast,我用C#编写代码,并愿意使用不安全/固定 我希望能够将字节[]转换为字符串[]。我从一个字符串文件开始(以\n结尾)。在从文件读取的字节数组中,我将所有\n替换为\0。我想现在可以将字节[]重新解释为字符串[],因为换行符现在是\0。我认为这是有道理的,但我可能错了。如果我回忆起C++(不幸的是几十年前),一个字符串[]只是一个char [][],每个内部char []都是空的。因此,我认为如果我能做(fancycast),下面的代码可以工作 //文件的每一行都包含字符串 byte[] byte

我用C#编写代码,并愿意使用不安全/固定

我希望能够将字节[]转换为字符串[]。我从一个字符串文件开始(以\n结尾)。在从文件读取的字节数组中,我将所有\n替换为\0。我想现在可以将字节[]重新解释为字符串[],因为换行符现在是\0。我认为这是有道理的,但我可能错了。如果我回忆起C++(不幸的是几十年前),一个字符串[]只是一个char [][],每个内部char []都是空的。因此,我认为如果我能做(fancycast),下面的代码可以工作

//文件的每一行都包含字符串

byte[] bytes = ReadFile();
Replace(bytes, '\n', \0');
string[] strings = (fancycast)bytes
我不知道怎么做(fancycast)。多谢各位

我知道C#中的所有流和阅读器,我有不使用它们的具体原因。请不要建议不同的设计。我只想重新解释这个数组。谢谢您的帮助。

C#使用PASCAL字符串,而不是C字符串。最好的办法可能是不使用
\n
字符并执行拆分()

C#使用PASCAL字符串,而不是C字符串。最好的办法可能是不使用
\n
字符并执行拆分()


如果您只想读取C语言的文件,只需使用:

string text = System.IO.File.ReadAllText("PathToFile");

否则,只需从字节创建一个字符串并拆分该字符串:

bytes[] = ReadFile();
string allData = System.Text.Encoding.<Encoding>.GetString(result);
string[] lines = allData.Split('\n');
bytes[]=ReadFile();
string allData=System.Text.Encoding..GetString(结果);
string[]line=allData.Split('\n');

如果您只想读取C语言的文件,只需使用:

string text = System.IO.File.ReadAllText("PathToFile");

否则,只需从字节创建一个字符串并拆分该字符串:

bytes[] = ReadFile();
string allData = System.Text.Encoding.<Encoding>.GetString(result);
string[] lines = allData.Split('\n');
bytes[]=ReadFile();
string allData=System.Text.Encoding..GetString(结果);
string[]line=allData.Split('\n');
试试看

但是,您不必将文件读取为字节数组,然后在C#中将其转换为字符串数组。相反,您可以分别使用ReadAllText(路径)或ReadAllLines(路径)直接读取字符串/字符串数组

string allText = File.ReadAllText("file path");
string[] allLines = File.ReadAllLines("file path");
试一试

但是,您不必将文件读取为字节数组,然后在C#中将其转换为字符串数组。相反,您可以分别使用ReadAllText(路径)或ReadAllLines(路径)直接读取字符串/字符串数组

string allText = File.ReadAllText("file path");
string[] allLines = File.ReadAllLines("file path");
关于C#string,有一件非常重要的事情需要了解:它们是Unicode字符的不可变序列,这是关于它们的唯一真正确定的事情。因此,您不能假设任何一个字符可能有多大,也不能假设字符串中任何字符的字节偏移量

好吧,你可以做一些假设,大多数时候它可能会工作,但是当它不工作的时候,调试将是一个巨大的痛苦

Unicode字符可能需要8、16或32位。C#对字符串使用UTF-16编码,这意味着字符串中的字符至少为16位。32位字符是Unicode规范的一部分(例如:Emojis通常位于32位空间中,如0x1F44C中的这一个:有一个重要的(非常重要的)关于C#字符串,需要了解的是:它们是Unicode字符的不可变序列,这是关于它们的唯一真正确定的事情。因此,你不能假设任何一个字符可能有多大,也不能假设字符串中任何字符的字节偏移量

好吧,你可以做一些假设,大多数时候它可能会工作,但是当它不工作的时候,调试将是一个巨大的痛苦


Unicode字符可能需要8位、16位或32位。C#对字符串使用UTF-16编码,这意味着字符串中的字符至少为16位。32位字符是Unicode规范的一部分(例如:Emojis通常位于32位空间,如0x1F44C处的此空间:。网络字符串不以null结尾,因此不需要字节数组。
string result=File.ReadAllText(File)。Replace('\n','\0')
。网络字符串不以null结尾,因此不需要字节数组。
string result=File.ReadAllText(File)。Replace('\n','\0'))
不太可能。Pascal字符串最多可包含255个8位字符。C#字符串为UNICODE,最多可包含65535个字符characters@RayFischer是的,你说得对。我的意思不是与PASCAL中的字符串类型完全相同。我应该说PASCAL样式的字符串,我猜是为了学究。我只是说它们以长度作为前缀,并且不是以null结尾的。不是真的y、 Pascal字符串最多为255个8位字符。C#字符串为UNICODE,最多为65535个字符characters@RayFischer是的,你说得对。我指的不是与PASCAL中完全相同的字符串类型。我应该说PASCAL风格的字符串,我猜是给学究们的。我只是指它们以长度作为前缀,并且不是以null结尾的。