我不想让人们解释为什么以及怎么这么说我会直接进入。
我有一个包含原始字节数据的字节数组。该数组是1000个字节。我想通过1000字节的数组并仅提取可能类似于文件名的UTF-16 Unicode字符,但我不知道字符出现在1000字节数组中的确切位置。
我读过 Lazarus Unicode Page和this但我仍然不确定我的问题的句法方法。我知道Unicode字符大小最多可达4个字节,但通常是两个(字母和空格)。
我已经使用UTF8encode(WideCharLenToString(@ MyArray,SomeIntValue)成功用于其他领域,我知道某些Unicode字符存在于this thread,我问过并现在已经解决了。但我现在需要“搜索” “对于他们现在,出于不同的原因,在数组中。例如”查看前16个字节。它们是Unicode吗?如果没有,请查看下一个16.它们是Unicode吗?如果是,请将它们转换为字符串并显示它们“。
任何人都可以帮助我吗?
答案 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。)