在Wireshark的帮助下,我从一串TCP数据段中提取了二进制数据,后来我发现这是一个BMP文件.然后加载一行二进制数据,将其从空格、换行符和中间"="中清除.我的意思是,它们在每个TCP数据段的末尾分开.

然后,我执行以下代码:

import base64

tst = sec_orig.replace('\n', '').replace(' ', '').replace('=', '')

decoded_data = base64.b64decode(tst + '=', altchars=None, validate=True)

Wireshark的原始数据:

Qk02MAEAAAAAADYEAAAoAAAAQAEAAPAAAAABAAgAAAAAAAAAAABCCwAAQgsAAAABAAAAAQAAAAAA
AAAAAAAAAKAAAPAAAPAAAAAA/PwA/PwAAPxw/AD8/PwAoKCgAEBAQABQMAAAWFhYANCg0ACgkHAA
oJBwANDQ0ADYyLQA1JgAANyEAAC4uLgAaPR0APCoAAAgICAAAJD8AAAA+ACoqKgAvLy8AMzMzADc
3NwA7OzsAPz8/AAAAAAAAAAQAAAAIAAAADAAAABEAAAAVAAAAGQAAAB0AAAAiAAAAJgAAACoAAAA
vAAAAMwAAADcAAAA7AAAAPwAAAAAAAAQAAAAIAAAADAAAABEAAAAVAAAAGQAAAB0AAAAiAAAAJgA
AACoAAAAvAAAAMwAAADcAAAA7AAAAPwAAAAAAAAQAAAAIAAAADAAAABEAAAAVAAAAGQAAAB0AAAA
iAAAAJgAAACoAAAAvAAAAMwAAADcAAAA7AAAAPwAAAD8AAAA/BAAAPwgAAD8MAAA/EQAAPxUAAD8
ZAAA/HQAAPyIAAD8mAAA/KgAAPy8AAD8zAAA/NwAAPzsAAD8/AAA/PwAAOz8AADc/AAAzPwAALz8
AACo/AAAmPwAAIj8AAB0/AAAZPwAAFT8AABE/AAAMPwAACD8AAAQ/AAAAPwAAAD8AAAA/BAAAPwg
AAD8MAAA/EQAAPxUAAD8ZAAA/HQAAPyIAAD8mAAA/KgAAPy8AAD8zAAA/NwAAPzsAAD8/AAA/PwA
AOz8AADc/AAAzPwAALz8AACo/AAAmPwAAIj8AAB0/AAAZPwAAFT8AABE/AAAMPwAACD8AAAQ/AAA
APwAAAD8ABAA/AAgAPwAMAD8AEQA/ABUAPwAZAD8AHQA/ACIAPwAmAD8AKgA/AC8APwAzAD8ANwA
/ADsAPwA/AD8APwA/AD8AOwA/ADcAPwAzAD8ALwA/ACoAPwAmAD8AIgA/AB0APwAZAD8AFQA/ABE
APwAMAD8ACAA/AAQAPwAAAAAAAAA 

...

BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF
BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJ

我从Base64得到了一个特定的二进制字符串:

b'BM60\x01\x00\x00\x00\x00\x006\x04\x00\x00(\x00\x00\x00@\x01\x00\x00\xf0\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x0b\x00\x00B\x0b\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\xf0\x00\x00\xf0\x00\x00\x00\x00\xfc\xfc\x00\xfc\xfc\x00\x00\xfcp\xfc\x00\xfc\xfc\xfc\x00\xa0\xa0\xa0\x00@@@\x00P0\x00\x00XXX\x00\xd0\xa0\xd0\x00\xa0\x90p\x00\xa0\x90p\x00\xd0\xd0\xd0\x00\xd8\xc8\xb4\x00\xd4\x98\x00\x00\xdc\x84\x00\x00\xb8\xb8\xb8\x00h\xf4t\x00\xf0\xa8\x00\x00   \x00\x00\x90\xfc\x00\x00\x00\xf8\x00\xa8\xa8\xa8\x00\xbc\xbc\xbc\x00\xcc\xcc\xcc\x00\xdc\xdc\xdc\x00\xec\xec\xec\x00
...
\t\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\t'

然后,我使用Pillow库显示从TCP流段获得的图像,并获得以下图像:

from PIL import Image
import io

Image.open(io.BytesIO(decoded_data))

失真的BMP图像

enter image description here

据我所知,某处相对于BMP colored颜色 矩阵发生了不正确的偏移,但我不知道我在哪里犯了错误,你能建议一下吗

图像显示出来了,但音调参差不齐,我还不知道如何正常化.

推荐答案

使用此脚本,我得到了一个未损坏的图像:

import io
from pathlib import Path

import yaml
from PIL import Image


packets = yaml.safe_load(Path("5bksih1B.txt").read_text())
raw = b"".join([p["data"] for p in packets])
im = Image.open(io.BytesIO(raw))
im.show()

full data you pasted张中有两张320x240的图片,结果如下:

im1

im2

Note:你注意到的那个"标记"Qk02MA实际上是bitmap header的开始:

>>> import base64
>>> base64.b64decode("Qk02MA==")
b'BM60'

要连续从流中读取帧,请首先解析该标头,然后从缓冲区中使用正确的字节数.

Python相关问答推荐

更改matplotlib彩色条的字体并勾选标签?

根据条件将新值添加到下面的行或下面新创建的行中

Pandas 在最近的日期合并,考虑到破产

如何从具有不同len的列表字典中创建摘要表?

scikit-learn导入无法导入名称METRIC_MAPPING64'

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

在代码执行后关闭ChromeDriver窗口

使用字典或列表的值组合

如何强制向量中的特定元素在Gekko中处于优化解决方案中

freq = inject在pandas中做了什么?''它与freq = D有什么不同?''

Python类型提示:对于一个可以迭代的变量,我应该使用什么?

使用python playwright从 Select 子菜单中 Select 值

如何在Airflow执行日期中保留日期并将时间转换为00:00

使用xlsxWriter在EXCEL中为数据帧的各行上色

FileNotFoundError:[WinError 2]系统找不到指定的文件:在os.listdir中查找扩展名

在聚合中使用python-polars时如何计算模式

如何删除剪裁圆的对角线的外部部分

大Pandas 中的群体交叉融合

根据边界点的属性将图划分为子图