我正在尝试在图像中找到一些exif数据。
所以首先我需要找到数字0x45786966
('Exif'为unsignedInt32)并存储偏移量。
接下来的两个字节应为零,之后应存储的字节序为unsignedInt16(0x4d4d或0x4949)。
我可以使用Bytes
模块将图像获取为elm/file
。但是,如何搜索“ Exif”开头并解析这些Bytes
中的字节序?
我看过loop
-example中的loop
,但并不完全了解。首先,它读取列表的长度(unsignedInt32),然后逐字节读取?如果我想读取unsignedInt32s而不是字节,怎么办?
如何设置偏移量以指示下一步应读取elm/bytes
之类的功能?
该示例开始时讨论的是结构尺寸为已知大小的数据。对于您而言,您想要做的是搜索,因此这是一个完全不同的问题。
问题是unsignedInt32
并非真正用于处理搜索。如果可以保证所要查找的部分是按字节对齐的,则很有可能做到这一点,但是鉴于您所说的,这不是一种简单的方法,因为您不能逐个迭代-位。
您将不得不读入未对齐的值,然后在其中手动搜索所需数字的一部分。考虑到该方法的难度和效率低下,我建议在该用例中使用端口代替。
如果可以保证所搜索的内容将按字节对齐(或者更好的是,与数字的长度对齐),则可以一次解码一个字节,直到找到所需的内容为止。无法读取给定的偏移量,如果要读取到特定点,则需要读取并丢弃值。
为此,您需要建立一个循环,其中状态包含要查找的值的数量。每一步,您都要检查是否已完成(成功),是否具有下一个部分(继续)或是否有其他内容(将状态重置为从头开始搜索)。如果您找不到末尾,则说明您失败了。