我正在尝试提取从CR2拍摄照片的日期/时间(原始照片的佳能格式).
我知道CR2规范,我知道我可以使用Python struct模块从二进制缓冲区中提取片段.
简而言之,规范说在Tag中0x0132 / 306我可以找到一个长度为20的字符串 - 日期和时间.
我尝试使用以下方法获取该标记:
struct.unpack_from(20*'s', buffer, 0x0132)
Run Code Online (Sandbox Code Playgroud)
但我明白了
('\x00', '\x00', "'", '\x88, ...[and more crap])
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑
非常感谢您的全力以赴!答案是惊人的,我学到了很多关于处理二进制数据的知识.
我对Putmonad提供的Builder直接使用内容感到困惑Data.Binary.我阅读了处理二进制数据的二进制生成部分,它似乎假设您应该使用Put,但它很短并不能解释原因.
Data.Binary.Put
Put monad.一个有效构造惰性字节串的monad.
Run Code Online (Sandbox Code Playgroud)type Put = PutM ()只需将Builder升级为Writer monad,应用于().
Data.Binary.Builder
高效构造惰性字节串.
什么是点Writer单子应用()?
我可以看到它Put是(一个类型的同义词)monad而Builder不是,但我真的不明白为什么Put需要.
在我的例子中,我正在渲染3D场景并将每个像素写为3个字节,然后将PPM格式的标题添加到开头(之后将使用PNG).
Binary似乎它是为了可以对二进制数据进行序列化和反序列化的类型进行实例化.这不完全是我正在做的事情,但是Binary为我的颜色类型实例化感觉很自然
instance (Binary a) => Binary (Colour a) where
put (Colour r g b) = put r >> put g >> put b
get = Colour <$> get <*> get <*> get
Run Code Online (Sandbox Code Playgroud)
这可以很容易地put一Colour Word8到24位.但是接下来我还要抓住标题,我不知道该怎么做.
是Builder隐藏在幕后,还是依赖于它?是 …
我正在尝试编写一个讨论二进制网络协议的小型Haskell程序,而且我遇到了一个令人惊讶的困难.
很明显二进制数据应该存储为ByteString.
问题:我应该hGet/ hPut单个多字节整数,还是更高效地构建ByteString整个事物并使用它?
看起来这个binary包应该在这里很有用.但是,binary只处理惰性 ByteString值.
问:是否hGet在偷懒 ByteString实际读取的字节严格的规定是多少?或者它是否尝试做某种懒惰的I/O?(我不想要懒惰的I/O!)
问题:为什么文档没有指定这个?
代码看起来会包含很多"获取下一个整数,将其与此值进行比较,如果没有则抛出错误,否则继续执行下一步..."我不确定如何干净地构造没有写意大利面条代码.
总之,我想要做的事情很简单,但我似乎正在努力寻找使代码看起来简单的方法.也许我只是过度思考这个并且遗漏了一些明显的东西......
在clojure中解析二进制数据的最简洁方法是什么?我需要能够同样干净地读/写文件或套接字.
就像是:
(read-data source-of-data)
=> { :index 42 , :block-size 4 , data-size: 31415, :data (1 2 3 4 ...)}
以及将数据放回的反向.以某种方式定义结构并使读写函数使用相同的定义真的很棒.
这可能是也可能不是灰色地区的主题,虽然我的意图当然不是,所以我的意图不是激起关于逆向工程主题的道德辩论.
我是目前正在接受泵疗法的1型糖尿病患者.我是OmniPod用户,它是一个一次性的豆荚,粘在我的身体上并分配胰岛素3天.它由个人糖尿病管理员[PDM](见下文)控制,该管理员控制在用餐期间分配多少胰岛素,血糖读数,并且它包含用于计算碳水化合物的食物指数.
替代文字http://www.myomnipod.com/images/pdm-200.jpg
新PDM具有用于下载数据的USB端口.该软件对Windows用户是免费的(一个名为CoPilot的软件包),但没有Mac支持.
将PDM插入我的Mac后,它就像任何其他USB设备一样安装,并向我提供一个可读卷,上面有一个带有IBF扩展名的单个文件.它的重量为16KB.
我的第一直觉是通过文本编辑器传递它,并呈现了一个非常二进制的文件.然后我通过字符串传递它(见下文)并用十六进制编辑器打开它.虽然除了下面的字符串之外我无法获得太多信息; 没有压缩格式的细节或任何东西
$ strings omnipoddata.ibf
Insulet
OmniPod
basal 1
Post-meal
e-meal
Pre-meal
e-bedtime
Pre-bedtime
.(@P
.(@P
.(@P
Run Code Online (Sandbox Code Playgroud)
在这个过程中我的下一步应该是什么?我是一个动态的语言人,因此Ruby的任何资源都很棒,或者Python.是否有任何测试驱动的逆向工程流程?
至于我想要获得的数据,我想绘制的信息可以获得更多关于我的进展的信息(胰岛素摄入量,血糖读数,时间戳); 所有这些都可以在Windows软件包中使用.
所以我有一个Visual Studio 2008项目,它有大量当前引用的二进制数据.我希望通过将二进制数据作为"资源"添加并将其编译为DLL来打包二进制数据,就像使用C#一样.
让我们说我的所有数据都有".data"的扩展名,目前正在从visual studio项目中读取.
有没有办法可以将数据编译或链接到它正在调用的.dll中?
我已经查看了一些google链接,到目前为止我还没有想出任何东西 - 我提出的唯一可能的解决方案是使用类似ResGen的东西来创建.resources文件然后链接它使用带有/ Embed或/ Link标志的AssemblyLinker.我不认为它工作正常,因为我没有文本文件来创建.resources文件,而是二进制文件本身.
有什么建议?
我有一个包含多个数据通道的文件.文件以基本速率进行采样,每个通道以基本速率除以某个数字进行采样 - 它似乎总是2的幂,但我认为这不重要.
所以,如果我有通道a,b和c,在1,2和4的分隔处采样,我的流将如下所示:
a0 b0 c0 a1 a2 b1 a3 a4 b2 c1 a5 ...
Run Code Online (Sandbox Code Playgroud)
为了增加乐趣,通道可以独立地浮动或整数(虽然我知道每个通道),并且数据流不一定以2的幂结束:示例流在没有进一步扩展的情况下是有效的.虽然我知道我正在处理的是什么,但这些价值有时很大,有时甚至是小端.
我有一些代码可以正确地解包这些并用正确的值填充numpy数组,但它很慢:它看起来像(希望我不会过多地掩盖;只是给出算法的概念):
for sample_num in range(total_samples):
channels_to_sample = [ch for ch in all_channels if ch.samples_for(sample_num)]
format_str = ... # build format string from channels_to_sample
data = struct.unpack( my_file.read( ... ) ) # read and unpack the data
# iterate over data tuple and put values in channels_to_sample
for val, ch in zip(data, channels_to_sample):
ch.data[sample_num / ch.divider] = val …Run Code Online (Sandbox Code Playgroud) 我有一些Pragmatic-Programmer类型代码生成的经验:以平台中立格式指定数据结构,并为代码生成器编写模板,这些代码生成器使用这些数据结构文件并生成将原始字节拉入特定于语言的数据结构的代码,对数字数据进行缩放,打印出数据等.很好的实用(TM)思想是(a)我可以通过修改我的规范文件和重新生成源(这是DRY和所有这些)来改变数据结构和( b)我可以通过修改模板添加可以为我的所有结构生成的其他函数.
我使用的是一个名为Jeeves的Perl脚本,但它是通用的,我想编写的任何函数来操作我从头开始编写的数据.
是否有任何框架非常适合为结构化二进制数据创建解析器? 我读过的Antlr表明这太过分了.我目前感兴趣的目标语言是C#,C++和Java,如果重要的话.
一如既往地谢谢.
编辑: 我会在这个问题上给予赏金.如果有任何我应该看的区域(搜索的关键词)或其他攻击你自己开发的问题的方法,我很乐意听到它们.
我正在逆向工程AC遥控器.当我发送温度值(从17C到30C)时,我得到以下流.
Temperature - Binary - Hex - Decimal
17C - 00000000 - 0x00 - 0
18C - 00010000 - 0x10 - 16
19C - 00110000 - 0x30 - 48
20C - 00100000 - 0x20 - 32
21C - 01100000 - 0x60 - 96
22C - 01110000 - 0x70 - 112
23C - 01010000 - 0x50 - 80
24C - 01000000 - 0x40 - 64
25C - 11000000 - 0xc0 - 192
26C - 11010000 - 0xd0 - 208
27C - …Run Code Online (Sandbox Code Playgroud) iOS 13的CryptoKit框架.rawRepresentation为ECDSA公钥和私钥提供了价值。我一直在尝试对rawRepresentation数据类型进行逆向工程,以便在它与JWK之间进行转换。从公钥表示形式的64字节长度来看,这似乎是一个简单的x || y串联。我猜想那会是私钥x || y || d,但是事实并非如此,因为这样做应该会产生96字节的字符串,而实际rawRepresentation是144字节。似乎也不是有效的DER / ASN.1字符串。我还没有找到符合我所得到的实际值的规格。
如您所料,Apple的文档具有很强的描述性。
rawRepresentation:私钥的表示形式,以字节的集合表示。
提供了十六进制的示例密钥对。
Private: 988f8187ff7f00007466815b0d6b02ae1a063198fd1e4923fb1e413195126cc00d30483284186b435726c0c69cc774274ea32eb6a17cbaf2ea88dd7f3a5a2a3ce637bc4b96523c2795035bd2fbeb093b010000000000000000000000000000000000000000000000000000000000000012b2b61abe8beae5aeb6d0bda739235364de96c7f498813cfb0336198dcf9063
Public: 2774c79cc6c02657436b18843248300dc06c129531411efb23491efd9831061a3b09ebfbd25b0395273c52964bbc37e63c2a5a3a7fdd88eaf2ba7ca1b62ea34e
Run Code Online (Sandbox Code Playgroud)
这是什么格式?