Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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# 如何将包含零的字节缓冲区转换为字符串_C#_String_Bytearray - Fatal编程技术网

C# 如何将包含零的字节缓冲区转换为字符串

C# 如何将包含零的字节缓冲区转换为字符串,c#,string,bytearray,C#,String,Bytearray,我有一个字节数组作为输入。这应该是符合标准的UTF8 HTML的二进制表示。是的,但大多数时候只是这样。有时它还包含嵌入的空值(\x0字符或NUL)。这不在我的控制之下。我需要将这个字节数组转换成字符串 迄今为止: 显然,使用StreamReader或TextReader不会起作用,因为它会在点击第一个NUL Encoding.UTF8.GetString也不起作用-也会在第一个NUL 有效但不合法的: mynewarray = myoldarray.Where( x => x!

我有一个字节数组作为输入。这应该是符合标准的UTF8 HTML的二进制表示。是的,但大多数时候只是这样。有时它还包含嵌入的空值(
\x0
字符或
NUL
)。这不在我的控制之下。我需要将这个字节数组转换成字符串

迄今为止:

  • 显然,使用
    StreamReader
    TextReader
    不会起作用,因为它会在点击第一个
    NUL
  • Encoding.UTF8.GetString也不起作用-也会在第一个
    NUL
有效但不合法的:

   mynewarray = myoldarray.Where( x => x!=0).ToArray();
   var output = Encoding.UTF8.GetString(mynewarray);

除了创建一个新的字节数组跳过
NUL
字符,然后使用上面的一种解决方案之外,还有没有更优雅的方法来实现这一点?字节数组可能相当大,超过2-4 Mb。。。MSDN指出字符串实际上可能包含嵌入的
NUL
,但没有说明处理此类字符串的最佳方法。

使用GetString重载,该重载获取开始索引和要解码的字节数

var output = Encodeing.UTF8.GetString(mynewarray, 0, mynewarray.Length);

使用GetString的重载,它获取开始索引和要解码的字节数

var output = Encodeing.UTF8.GetString(mynewarray, 0, mynewarray.Length);

您的代码在我看来很好,但您可以通过手动控制缓冲区大小(不确定
Where()
的作用)和/或使用不安全的代码来优化它

指针数学非常适合通过数组进行快速迭代,您可以完全控制希望将内存指针向前推进多少(因此它是“不安全的”)。这意味着您可以随意使用/跳过任何字符。为此,我经常在c#中使用优化缓冲区+不安全代码


NET framework在适当的情况下使用缓冲和不安全代码,但由于您知道自己的确切需求,因此可以调整性能。但是,这会导致代码更加冗长。

我觉得您的代码看起来不错,但是您可以通过手动控制缓冲区大小(不确定
Where()
的作用)和/或使用不安全的代码来优化它

指针数学非常适合通过数组进行快速迭代,您可以完全控制希望将内存指针向前推进多少(因此它是“不安全的”)。这意味着您可以随意使用/跳过任何字符。为此,我经常在c#中使用优化缓冲区+不安全代码


NET framework在适当的情况下使用缓冲和不安全代码,但由于您知道自己的确切需求,因此可以调整性能。但是,它将导致更详细的代码。

您的字符串已经正确。它将包含
NUL
字符。但是当您使用包含
num
字符的字符串时,您将遇到各种各样的问题

Encoding.UTF8.GetString
不会像我的示例中所示的那样在\0处停止

看看我输出这样一个字符串时会发生什么:

  var text = new byte[]{65, 65, 0, 65};
  var s = Encoding.UTF8.GetString(text);
  Console.WriteLine("len is: " + s.Length + " chars");
  Console.WriteLine("text: '" + s + "'");      
  Console.WriteLine("this line doesn't appear because NUL was sent to console");
输出为:

len is: 4 chars
text: 'AA

你的字符串已经对了。它将包含
NUL
字符。但是当您使用包含
num
字符的字符串时,您将遇到各种各样的问题

Encoding.UTF8.GetString
不会像我的示例中所示的那样在\0处停止

看看我输出这样一个字符串时会发生什么:

  var text = new byte[]{65, 65, 0, 65};
  var s = Encoding.UTF8.GetString(text);
  Console.WriteLine("len is: " + s.Length + " chars");
  Console.WriteLine("text: '" + s + "'");      
  Console.WriteLine("this line doesn't appear because NUL was sent to console");
输出为:

len is: 4 chars
text: 'AA

实际上,
UTF8.GetString(byte[])
不应该在零位停止。。。但在此之后,您确实有一个字符串包含
“\0”
,我的断言依赖于length属性,该属性远远小于缓冲区大小。我需要仔细检查。如果有扩展字符,字符串的长度将小于缓冲区大小。实际上,
UTF8.GetString(byte[])
不应该在零处停止。。。但在此之后,您确实有一个字符串包含
“\0”
,我的断言依赖于length属性,该属性远远小于缓冲区大小。我需要仔细检查。如果字符串中有扩展字符,字符串的长度将小于缓冲区大小。您完全正确,代码确实已经在工作了。。。由于
\r\n
转换,我忽略了长度不匹配的问题,因此遗漏了一个数字。长度实际上比原始数组大。我现在哑口无言。。现在觉得有点傻。然后,我可以使用
Replace
方法删除转换字符串中的
NUL
字符。这使得代码更加安全,因为在某些编码中,0字节可能是有效的。现在我可以避免扔掉源数组中的0字节。你完全正确,代码确实已经在工作了。。。由于
\r\n
转换,我忽略了长度不匹配的问题,因此遗漏了一个数字。长度实际上比原始数组大。我现在哑口无言。。现在觉得有点傻。然后,我可以使用
Replace
方法删除转换字符串中的
NUL
字符。这使得代码更加安全,因为在某些编码中,0字节可能是有效的。现在我可以避免丢弃源数组中的0字节。