这似乎是一个简单的问题,但 crypto++ 似乎是以一种时髦的“尽可能钝”的方式设计的,所以我想知道......
如何从 CryptoPP::Base64Decode 对象中获取二进制数据?假设我不想将其写入文件或以其他方式对其进行编码,我该如何获取实际的二进制数据?
编辑:想通了;不知道如何关闭/删除它,有人吗?我现在在这里做什么合适?
没关系,想通了。作为参考,我想获取 BufferedTransformation 子类的 MaxRetrievable 和 Get 方法。
这似乎是一个简单的问题,但 crypto++ 似乎是以一种时髦的“尽可能钝”的方式设计的,所以我想知道......
如果您不熟悉 Crypto++ 设计,这不是一个简单的问题。实际上有两种设计在起作用。
首先是经典的更新/决赛。Put
它与和Get
朋友一起在 Crypto++ 中实现。
二是流水线设计。这就是数据从源流向接收器的地方,您会看到它,例如:
FileSource fs( "Hello World", true /*pumpAll*/
new HexEncoder( e,
new FileSink( "encoded.txt" )
); // FileSource
管道等效于 Unix 命令:
echo "Hello World" | base64 >> encoded.txt
管道概括为:
Source -> Filter -> Filter -> ... -> Filter -> Sink
在内部,Source 将调用Put
第一个过滤器;第一个过滤器将转换数据并调用Put
第二个过滤器,依此类推。最后一个过滤器将调用Put
Sink。更准确地说,Source 和 Filters 将调用Put2
,但这是一个实现细节。
如果没有 Sink:
Source -> Filter -> NULL
然后过滤器将在内部缓冲转换后的数据。您可以使用Get
, GetWord16
, GetWord32
, MaxRetrievable
,AnyRetrievable
等从过滤器或接收器中提取数据。
Put
, Get
,MaxRetrievable
和 friends 是BufferedTransformation
接口的一部分,这是所有过滤器和接收器都实现的接口(实际上不需要源来实现它)。如果一个类不提供Put
,Get
和朋友,那么它不是过滤器或接收器。该类的文档位于BufferedTransformation Class Reference。
它还有很多其他功能,包括以块为单位阻塞和抽取数据,但 Base64 过滤器或对象并不真正需要它。上pumpAll
例中的意思是一次性推送所有数据。