我有一个UTF-8编码的字符串,我想迭代它, 将它拆分为多个分隔符之一。我也需要知道 哪个分隔符匹配,因为每个分隔符都有特定含义。
示例用法:
algorithm("one, two; three") => Match("one")
algorithm(", two; three") => Delimiter(",")
algorithm(" two; three") => Match(" two")
algorithm("; three") => Delimiter(";")
algorithm(" three") => Match(" three")
其他信息:
我的目标语言是Rust,但我会很感激 具有类似较低级别焦点的语言。伪代码也很好, 只要它能识别出UTF-8文本的真实性。解决方案 使用深奥的十六进制技巧或SIMD指令也是合适的,但可能需要更多解释才能理解^ _ ^。
答案 0 :(得分:1)
对于特定于处理器的解决方案,带有SSE4.2的X86-64处理器包含PCMPxSTRx
系列指令。这些说明中提供的模式之一是等于任何:
arg1
是一个字符集,arg2
是要搜索的字符串。如果IntRes1[i]
位于由{{1}表示的集合中,则arg2[i]
设置为1 }
基本算法很简单:
arg1
。rax
中设置haystack字节数。rdx
。PCMPxSTRx
或其中一个控制代码标记的结果。但是有a complication around page boundaries。也就是说,ecx
指令将始终读取16个字节的数据。如果您读入受保护的内存页,则可能会导致分段错误。解决方案是将所有读取与字符串的 end 对齐,并在开头处理剩余的字节。在开始上述算法之前,请使用以下内容:
PCMPxSTRx
屏蔽字符串开头的地址。这清除了所有低位。~0xF
指令(使用与上述算法类似的设置)。这将返回匹配字符的掩码。您可以移动蒙版以忽略不属于字符串的前导字符。您可以在我的Rust library Jetscii中查看此算法的完整示例。内联汇编用于调出PCMPxSTRM
指令。