从原始字节数组中搜索Unicode字符 - 免费Pascal \ Lazarus或Delphi

时间:2012-04-18 21:32:52

标签: delphi unicode bytearray freepascal

我不想让人们解释为什么以及怎么这么说我会直接进入。

我有一个包含原始字节数据的字节数组。该数组是1000个字节。我想通过1000字节的数组并仅提取可能类似于文件名的UTF-16 Unicode字符,但我不知道字符出现在1000字节数组中的确切位置。

我读过 Lazarus Unicode Pagethis但我仍然不确定我的问题的句法方法。我知道Unicode字符大小最多可达4个字节,但通常是两个(字母和空格)。

我已经使用UTF8encode(WideCharLenToString(@ MyArray,SomeIntValue)成功用于其他领域,我知道某些Unicode字符存在于this thread,我问过并现在已经解决了。但我现在需要“搜索” “对于他们现在,出于不同的原因,在数组中。例如”查看前16个字节。它们是Unicode吗?如果没有,请查看下一个16.它们是Unicode吗?如果是,请将它们转换为字符串并显示它们“

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:5)

不知道字节的实际布局,或文件名的格式(它是否有驱动器号和路径,是否使用UNC路径,或者它本身只是一个文件名?),寻找边界文件名字符串很难。

如果您可以假设文件名始终以驱动器号和路径开头,那么您可以每次一个字节循环遍历数组,直到您解码由{{1}之间的字符组成的六字节UTF-16序列。 } - 'a''z' - 'A'后跟'Z'':'个字符。如果您发现这种情况,请继续解码UTF-16序列,直到您遇到解码的空字符或不是有效UTF-16序列的二进制值,例如:

'\'

答案 1 :(得分:0)

UTF-16代码点长度为2个字节或4个字节。这不是一封信和一个空间;在单独的情况下,大多数16位字是有效的UTF-16字符。 (D800和DBFF之间的值的代码点后面必须跟一个DC00-DFFF范围内的值才能生成一个完整的Unicode字符。)如果您只是在寻找有效的UTF-16,那么您不太可能取得很大进展。您需要查看文件名中的特定模式,例如.ext(将以UTF-16编码为\ 00。\ 00e \ 00x \ 00t或。\ 00e \ 00x \ 00t \ 00,具体取决于是否为big-endian或little-endian。)