我有一个字节数组,每个字节都用 0xFF 初始化:
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = 0xFF;
}
此字节数组填入有效数据后,我需要提取存储在偏移量 192 处且长度最多为 32 个字符的 ASCII 字符串。我这样做是这样的:
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);
我不会尝试提供不是有效 ASCII 编码文本的 Encoding.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 替换字符的编码...但是当您只能找到二进制数据停止的位置时,这会很麻烦有效。
关于c# - 从字符串末尾修剪十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9086459/