从管柱末端修剪六角

本文关键字:六角 修剪 | 更新日期: 2023-09-27 18:22:14

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

for (int i = 0; i < buffer.Length; i++)
{
    buffer[i] = 0xFF;
}

一旦这个字节数组填充了有效数据,我就需要提取一个ASCII字符串,该字符串存储在偏移192处,长度可能长达32个字符。我是这样做的:

ASCIIEncoding enc = new ASCIIEncoding();
stringToRead = enc.GetString(buffer, 192, 32);

这是有效的,但我需要去掉包含0xFF的尾随字节,以避免字符串看起来像"John Smith。.NET中有提供这种功能的函数吗?可能是String.TrimEnd()函数之类的东西,或者我正在寻找一个正则表达式来实现这一点?

从管柱末端修剪六角

我建议找出字符串的实际长度

int firstFF = Array.IndexOf(buffer, (byte) 0xff, 192);
if (firstFF == -1)
{
    firstFF = buffer.Length;
}
stringToRead = Encoding.ASCII(buffer, 192, firstFF - 192);

我不会尝试给出Encoding.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替换字符的编码。。。但是,当您只能找到二进制数据停止有效的位置时,这会带来很多麻烦。

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);