【问题标题】:trim hex from end of string从字符串末尾修剪十六进制
【发布时间】:2012-02-23 13:55:49
【问题描述】:

我有一个字节数组,每个字节都用 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() 函数之类的东西,或者我是否正在查看正则表达式来执行此操作?

【问题讨论】:

    标签: c# string hex trim


    【解决方案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);
    

    【讨论】:

    • 不确定,但这可能会失败,因为 0xFF 已经是 ASCII,现在编码为 UTF-16。
    • 如果字节数组包含一堆无效的 ASCII 字符,这 不会 工作 - 因为它们不会以 Unicode U+00FF 结尾,它们会以作为 '?'。仅仅因为它适用于手工制作的字符串并不意味着它可以适用于原始字节数组。
    【解决方案2】:

    我建议只是找出字符串将 真正 有多长:

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

    【讨论】:

    • 虽然我通常同意你的观点,但在处理串行数据的情况下,执行这种查找是一种合理的方法,因为不知道有多少字节已读入缓冲区.
    • @codekaizen:我在哪里说寻求不合理?我说过从二进制解码为文本之后不要这样做,因为它不会做你想要的......
    • 感谢乔恩(以及其他所有人)。这个解决方案对我来说效果很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2013-09-11
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多