需求
ceph里面的omap数据是二进制的文件,需要对里面的内容进行替换
数据
[root@lab101 opt]# hexdump -C b_head
00000000 02 00 00 00 00 00 00 00 4c 0f 00 00 00 00 01 00 |........L.......|
00000010 00 08 |..|
00000012
原始数据是一个二进制文件,其中里面的inode是0f 00 00 00 00 01,这个是一个反转的字符,实际应该是01 00 00 00 00 0f ,所以替换需要做些处理
这里用到了python自带的库binasscii这个
代码如下
#! /usr/bin/python
# -*- coding:utf=8 -*-
import binascii
#硬链接的字符编码是固定的,我们不用本地读取,直接构建即可
#原始反转byte后字符串为: 08000001000000000f4c0000000000000002
basestr="080000ffffffffffff4c0000000000000002"
baseinode="ffffffffffff"
#改成指定位数的修改会比较好点,这样不管之前的代码是什么,可以直接构建了
#下面的方法是读取的二进制的,这里我直接构建字符串的方法
#hexdata = binascii.hexlify(a)
#print hexdata
#newhexdata = binascii.unhexlify(hexdata)
#newstr=hexdata[:: - 1 ]
newnewstr=basestr.replace(baseinode,"010000000011")
#反转回来(要对二进制反转不能字符反转)
newbin=binascii.unhexlify(newnewstr)[:: - 1 ]
with open("foo", "wb") as n:
n.write(newbin)
上面的inode是十二位,如果不足十二位,实际注意在前面补0
替换后的效果
[root@lab101 opt]# hexdump -C foo
00000000 02 00 00 00 00 00 00 00 4c 11 00 00 00 00 01 00 |........L.......|
00000010 00 08 |..|
00000012
总结
本篇记录二进制编辑的方法