为什么 C# IndexOf 搜索空字符 return 零?
Why does C# IndexOf search for null characters return zero?
这是我使用 .NET Core 6 的示例代码:
using System;
namespace testTerminator
{
class Program
{
static void Main(string[] args)
{
// Given an array of bytes:
byte[] array = {72, 101, 108, 108, 111, 0, 0, 32, 72, 101};
// Converted to a string:
string data = System.Text.Encoding.ASCII.GetString(array);
// Why does the following line not return the position
// of the null characters?
int terminator = data.IndexOf("[=11=][=11=]"); // returns 0
// Output:
Console.WriteLine("Data is '{0}'", data);
Console.WriteLine("Found terminator at {0}", terminator);
// Verify null characters are still in the data string:
byte[] dataBytes = System.Text.Encoding.ASCII.GetBytes(data);
for (int i = 0; i<dataBytes.Length; i++){
Console.Write("{0},", dataBytes[i]);
}
Console.WriteLine();
}
}
}
这导致以下输出:
Data is 'Hello He'
Found terminator at 0
72,101,108,108,111,0,0,32,72,101,
当空字符位于位置 6 时,为什么 IndexOf("[=19=][=19=]") return 为零?
由于我的代表未满 50 岁,我无法发表评论。
我使用 Net Core 3.1 在我的 vs 2019 社区上尝试了你的代码
输出如下;
”
数据是 'Hello He'
在 5 处找到终止符
72,101,108,108,111,0,0,32,72,101,
“
这没什么大不了的,但您可能想尝试使用不同版本的 Net Core
最佳,
by @AndrewS in the comments, this is documented by Microsoft. 默认情况下使用 CurrentCulture
,如果该文化存在被忽略的字符,则默认使用 returns 0
。在 .Net 5 中,Unicode 库发生了变化,这影响了这一点。
请注意,您可以在一个简单的 one-liner:
中重现此内容
Console.WriteLine("abc[=10=]".IndexOf("[=10=]"));
要解决此问题,您需要使用序号比较
int terminator = data.IndexOf("[=11=][=11=]", StringComparison.Ordinal); // returns 0
奇怪的是,当您使用 char
版本时它不会执行此操作
Console.WriteLine("abc[=12=]".IndexOf('[=12=]'));
Returns3
。这是因为它进行了序数比较 by default.
这是我使用 .NET Core 6 的示例代码:
using System;
namespace testTerminator
{
class Program
{
static void Main(string[] args)
{
// Given an array of bytes:
byte[] array = {72, 101, 108, 108, 111, 0, 0, 32, 72, 101};
// Converted to a string:
string data = System.Text.Encoding.ASCII.GetString(array);
// Why does the following line not return the position
// of the null characters?
int terminator = data.IndexOf("[=11=][=11=]"); // returns 0
// Output:
Console.WriteLine("Data is '{0}'", data);
Console.WriteLine("Found terminator at {0}", terminator);
// Verify null characters are still in the data string:
byte[] dataBytes = System.Text.Encoding.ASCII.GetBytes(data);
for (int i = 0; i<dataBytes.Length; i++){
Console.Write("{0},", dataBytes[i]);
}
Console.WriteLine();
}
}
}
这导致以下输出:
Data is 'Hello He'
Found terminator at 0
72,101,108,108,111,0,0,32,72,101,
当空字符位于位置 6 时,为什么 IndexOf("[=19=][=19=]") return 为零?
由于我的代表未满 50 岁,我无法发表评论。 我使用 Net Core 3.1 在我的 vs 2019 社区上尝试了你的代码 输出如下;
” 数据是 'Hello He' 在 5 处找到终止符 72,101,108,108,111,0,0,32,72,101, “
这没什么大不了的,但您可能想尝试使用不同版本的 Net Core
最佳,
CurrentCulture
,如果该文化存在被忽略的字符,则默认使用 returns 0
。在 .Net 5 中,Unicode 库发生了变化,这影响了这一点。
请注意,您可以在一个简单的 one-liner:
中重现此内容Console.WriteLine("abc[=10=]".IndexOf("[=10=]"));
要解决此问题,您需要使用序号比较
int terminator = data.IndexOf("[=11=][=11=]", StringComparison.Ordinal); // returns 0
奇怪的是,当您使用 char
版本时它不会执行此操作
Console.WriteLine("abc[=12=]".IndexOf('[=12=]'));
Returns3
。这是因为它进行了序数比较 by default.