我一直试图通过逆向工程我在GIMP中创建的.png文件来解决这个问题.它是4x4像素.我的目标是将原始像素解码出文件,目的是将其反转以进行编码.
这是文件的完整十六进制转储:
89504E47 0D0A1A0A 0000000D 49484452 00000004 00000004
08020000 00269309 29000000 3F494441 54081D01 3400CBFF
01CC96B1 134FE120 C0CECDF1 5101FFA5 60000000 000000E0
403201DF E59286DF 6D000000 00000004 EDB11F00 2E007A21
93EDB11F 3063136F 4733525A 00000000 49454E44 AE426082
Run Code Online (Sandbox Code Playgroud)
根据规范,我们从PNG签名开始,这是前8个字节.
89504E47 0D0A1A0A
然后我们重复"块"结构,这个文件有3个"块",标题(IHDR),图像数据(IDAT),然后是结束"块"(IEND).
每个块被安排成:块数据长度的前4个字节,数据类型的接下来的4个字节,然后是实际数据的n个字节,然后是4个字节用于循环冗余校验(CRC)数据类型和实际数据部分.
通过......
0000000D
是块的数据长度(13个字节).
49484452
是块的类型(IHDR).
00000004 00000004 08020000 00
是块的数据(4字节宽度,高度; 1字节位深度,颜色类型,压缩方法,滤波方法,隔行扫描方法).
269309 29
是数据和类型的CRC(设法让代码从这里开始工作.
000000 3F
是下一个块的数据长度(63个字节).
494441 54
是块的类型(IDAT).
081D01 3400CBFF 01CC96B1 134FE120 C0CECDF1 5101FFA5 60000000 000000E0 403201DF E59286DF 6D000000 00000004 EDB11F00 2E007A21 93EDB11F 3063136F
是块的实际数据(压缩和过滤的图像数据).
所以我的实际问题是如何将最后一部分解码为原始像素?
根据 …
基本上我想将以下值打印为“true”、“false”或“nil”。如果我尝试仅使用包装的值,我会得到我想要的“nil”,但会获得不需要的“Optional(true)”或“Optional(false)。如果我强制解开该值并且值为 nil,则会出现致命错误。我尝试了下面的代码,因为我已经看到它适用于字符串,但是因为“nil”不是 Bool 类型,所以它不被接受。有什么解决方案吗?
var isReal: Bool?
String("Value is \(isReal ?? "nil")")
Run Code Online (Sandbox Code Playgroud)
我正在导出到 csv 文件,了解此值是真还是假或尚未检查很有用。