从字符串末尾修剪十六进制

时间:2012-01-31 20:28:29

标签: c# string hex trim

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

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

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

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

这有效但我需要去除包含0xFF的尾随字节,以避免字符串看起来像“John Smith ??????????????????????? 。 .NET中是否有提供此功能的功能?像String.TrimEnd()这样的函数或者我正在看一个正则表达式来做这个吗?

2 个答案:

答案 0 :(得分:4)

我建议只找出字符串将真正的时间:

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

尝试提供Encoding.ASCII字节,这些字节不是有效的ASCII编码文本。我不知道 offhand 它会对它们做什么 - 我怀疑它会将它们转换为?以显示错误(正如你现有输出所示),但是你不会'能够分辨出这与真实问号之间的区别。例如:

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替换字符的编码......但是当你能找到二进制数据停止的地方时会有很多麻烦有效。

答案 1 :(得分:1)

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