首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

没有服务器下载权限?脚本帮搞定

>>>>

背景

python读写文件

文章讲了一些python读写文件的基础操作。在文章的最后还对bmp图片的读写进行了简单介绍。我发现bmp格式的图片很有规律,也很方便python读写操作。

在还没接触python之前,就看过一篇文章:由于工作站(服务器)上的数据只能看,并不能下载到本地。作者使用脚本把工作站上的数据保存到图片中,截屏,然后在本地的电脑上再用脚本解析图片中的数据。这样就把服务器上的数据下载到本地了。

另外:别的行业我不清楚但在集成电路这个行业,攻城狮们一般是在服务器上工作,且服务器上的数据只允许看而不允许下载到pc上。如果你更喜欢在pc上看一些数据或文档,原来只能找管IT的专职人员,现在,你自己就能搞定。

>>>>

bmp图片

上面的文章对bmp格式的图片进行了简单的格式说明。但在实际使用时,还是遇到了很多坑。bmp格式图片的详细文章请参考:

https://blog.csdn.net/jemenchen/article/details/52658476

总结如下:

bmp格式也分很多种,本脚本中使用最常见的24位位图格式的bmp图片。之所以叫24位位图格式,是由于每一个像素点由3个byte组成(分别表示红绿蓝),一个byte=8bit,所以一个像素由24bit表示。比如红色可以用:b'\x00\x00\xff' 表示。

bmp格式文件前面54byte是header,里面保存了图片大小、长、宽等信息。

bmp格式的图片数据是从下向上,从左到右,连续且没有换行符的数据流。

如果数据不能填满这一行,则这一行不会被保存到图片中(自己多次测试发现的)

>>>>

设计思路

现在bmp的编码和解码需要两个python脚本完成,这就需要定一个编解码的协议。我设计的协议如下:

图片每行像素由自定义的两个像素开始,自定义的两个像素结尾。开始的两个像素我设置为:b'\x11\x22\x33\x44\x55\x66' ;结尾的两个像素我设置为:b'\x77\x88\x99\xaa\xbb\xcc'。这四个像素点的人为属性很强,在现实世界中能产生这样的像素的概率极小。

如果最后一行数据不能填满整行,则最后一行数据格式为:开始两个像素+有效数据+结尾两个像素+无效填充像素(无效填充必须要有,否则最后一行有效数据会丢失)

第一个脚本bmp_maker.py把要下载的数据填充到图片中。在服务器上把图片打开(要100%模式,不能缩小也不能放大)。在windows下对这个图片截屏,然后打开所有程序->附件->画图。然后另存为24位位图bmp格式图片。注意:一定要对全屏幕进行截屏保存。我试着只截取图片那一块,但解码时会出现问题,导致解码失败。

第二个脚本bmp_parser.py读取bmp截屏图片,从这个图片的最下面一行一行的读取每行的数据,如果这行的数据中不包括112233445566.*778899aabbcc这样的数据,则丢弃。如果包含,则把前后两个像素中间的数据写到二进制文件中。最后把这个新产生的文件进行保存即可还原出原来的文件。

>>>>

不足

由于bmp文件大小的限制,使得bmp文件中可以保存内容的大小也就在1-4M左右。本脚本支持将任何格式的数据保存到bmp图片中。但建议先对要保存的文档或数据进行压缩,再使用脚本将压缩包保存到bmp图片中。

linux 下对文档或文件夹压缩的命令为:

上文中指出,在bmp文件的header中有图片的长和宽的描述,如果现在脚本header的长和宽和你的电脑不匹配,建议自己根据自己电脑的分辨率调整。

由于本脚本只是在测试自己的一个思路,现在这个思路证明没有问题,就不再打算对脚本增加新的功能。由于没有增加校验位和其他冗余位,脚本不支持拍照解码。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180602G004C500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券