C# 从字符串末端修剪六角

C# 从字符串末端修剪六角,c#,string,hex,trim,C#,String,Hex,Trim,我有一个字节数组,每个字节用0xFF初始化: for (int i = 0; i < buffer.Length; i++) { buffer[i] = 0xFF; } 这是可行的,但我需要去掉包含0xFF的尾随字节,以避免字符串看起来像“John Smith”。NET中是否有提供此功能的函数?比如String.TrimEnd()函数,或者我正在看一个正则表达式来实现这一点 var s = "Whatever" + new String((Char)0xFF, 32); var

我有一个字节数组,每个字节用0xFF初始化:

for (int i = 0; i < buffer.Length; i++)
{
    buffer[i] = 0xFF;
}
这是可行的,但我需要去掉包含0xFF的尾随字节,以避免字符串看起来像“John Smith”。NET中是否有提供此功能的函数?比如String.TrimEnd()函数,或者我正在看一个正则表达式来实现这一点

var s = "Whatever" + new String((Char)0xFF, 32);
var trimmed = s.TrimEnd((Char)0xFF);
或者,您可以扫描字符串以查找字符的第一个索引,然后获取子字符串:

var index = s.IndexOf((Char)0xFF);
var trimmed = s.Substring(0, index);
或者,您可以扫描字符串以查找字符的第一个索引,然后获取子字符串:

var index = s.IndexOf((Char)0xFF);
var trimmed = s.Substring(0, index);

我建议你看看绳子到底有多长:

我不会尝试给出不是有效的ASCII编码文本的
编码.ASCII
字节。我不知道它会对它们做什么-我怀疑它会将它们转换为
,以显示错误(正如您现有的输出所建议的那样),但这样您就无法区分它们与真正的问号之间的区别。例如:

byte[] data = { 0x41, 0x42, 0x43, 0xff, 0xff };
string text = Encoding.ASCII.GetString(data);
Console.WriteLine(text.Contains((char) 0xff)); // False
Console.WriteLine(text.TrimEnd((char) 0xff).Length); // Still 5...

现在您可以创建一个使用非ASCII替换字符的编码。。。但是,如果你能找到二进制数据在哪里不再有效,那就太麻烦了。

我建议你只需找出字符串的实际长度:

我不会尝试给出不是有效的ASCII编码文本的
编码.ASCII
字节。我不知道它会对它们做什么-我怀疑它会将它们转换为
,以显示错误(正如您现有的输出所建议的那样),但这样您就无法区分它们与真正的问号之间的区别。例如:

byte[] data = { 0x41, 0x42, 0x43, 0xff, 0xff };
string text = Encoding.ASCII.GetString(data);
Console.WriteLine(text.Contains((char) 0xff)); // False
Console.WriteLine(text.TrimEnd((char) 0xff).Length); // Still 5...

现在您可以创建一个使用非ASCII替换字符的编码。。。但是,当您可以找到二进制数据停止有效的位置时,这会很麻烦。

不确定,但这可能会失败,因为0xFF是ASCII,现在编码为UTF-16。如果字节数组包含一堆无效ASCII字符,这将不起作用-因为它们不会以Unicode U+00FF结束,它们将以“?”结束。仅仅因为它使用手工制作的字符串并不意味着它将使用原始字节数组。不确定,但这可能会失败,因为0xFF是ASCII,现在编码为UTF-16。如果字节数组包含一堆无效的ASCII字符,这将不起作用-因为它们不会以Unicode U+00FF结束,它们将以“?”结束。仅仅因为它与手工制作的字符串一起工作并不意味着它将与原始字节数组一起工作。虽然我大体上同意你的观点,但在处理串行数据时,进行这种搜索是一种合理的方法,因为不知道有多少字节被读入了缓冲区。@codekaizen:我在哪里说过寻找是不合理的?我说从二进制解码到文本后不要这样做,因为它不会做你想要的…谢谢Jon(和其他人)。这个解决方案对我来说非常有效!虽然我大体上同意你的看法,但在处理串行数据时,有些情况下,这种寻道是一种合理的方法,因为不知道缓冲区中读取了多少字节。@codekaizen:我在哪里说过寻道是不合理的?我说从二进制解码到文本后不要这样做,因为它不会做你想要的…谢谢Jon(和其他人)。这个解决方案对我来说非常有效!