初学Python写二进制文件
初学Python写二进制文件
把一个图片的16进制数据保存到一个txt文本,从这个txt文本读出并保存为二进制文件jpg图片文件。说明:图片读出的0xff粘贴ff到文本中,读出时是字符串的”ff”。
我主要是用C语言,python为初学,python的编码思想还是用C的思想。
一、C的实现:
#include <stdio.h>
#include <string.h>
/*******************************
函数名:DSP_2_HEX
函数功能:字符串与十六进制数据转换
函数输入参数:dsp 要转换的字符串的地址
hex 转换16进制后的存放地址
count 转换16进制后的长度
"1234"->{0x12,0x34}
修改: 较严格判断字符类型 ‘0’~’9’ ’A’~’F’ ‘a’~’f’
********************************/
int DSP_2_HEX( unsigned char *dsp, unsigned char *hex, int count )
{
int i;
unsigned char ucTmp = 0;
for (i = 0; i < count; i++)
{
ucTmp = dsp[i*2];
/*将字符转为十六进制 ‘0’~’9’->0x00~0x09、 ’A’~’F’->0x0A~0x0F ‘a’~’f’->0x0A~0x0F*/
if(ucTmp>=0x30 && (ucTmp<=0x39))
{
hex[i] = ucTmp-0x30;
}
else if(ucTmp >= 0x41 && ucTmp<= 0x46)
{
hex[i] = ucTmp-0x41+10 ;
}
else if (ucTmp >= 0x61 && ucTmp<= 0x66)
{
hex[i] = ucTmp-0x61+10 ;
}
else
{
return -1;
}
/*第一个字符作为十六进制的高4位*/
hex[i] = hex[i] << 4;
ucTmp = dsp[i*2+1];
/*将字符转为十六进制 ‘0’~’9’->0x00~0x09、 ’A’~’F’->0x0A~0x0F ‘a’~’f’->0x0A~0x0F*/
if(ucTmp>=0x30 && (ucTmp<=0x39))
{
hex[i] += ucTmp-0x30;
}
else if(ucTmp >= 0x41 && ucTmp<= 0x46)
{
hex[i] += ucTmp-0x41+10 ;
}
else if (ucTmp >= 0x61 && ucTmp<= 0x66)
{
hex[i] += ucTmp-0x61+10 ;
}
else
{
return -1;
}
/*// 只有大写的字母可以转到十六进制
hex[i] = ( (dsp[i*2]<=0x39)? dsp[i*2]-0x30 : dsp[i*2]-0x41+10 );
hex[i] = (hex[i] << 4) &0xF0;
hex[i]+= ( (dsp[i*2+1]<=0x39) ? dsp[i*2+1]-0x30 : dsp[i*2+1]-0x41+10 );
*/
}
return 0;
}
int main()
{
FILE *fp;
int i = 0;
int j =0;
int len = 0;
unsigned char buffer[40*1024] = {0}; //从txt文本里读出的字符串
unsigned char photo[40*1024] = {0}; //将字符串中空格、回车等去掉后字符串
unsigned char photoHEX[20*1024] = {0}; //转为十六进制后的数组
int ch;
/*从txt中读出字符保存到buffer数组*/
fp = fopen("D:\\photo.txt","r");
if(fp != NULL)
{
while((ch=fgetc(fp))!=EOF)
{
buffer[i] = ch;
i++;
}
}
fclose(fp);
fp = NULL;
len = i; //字符长度
/*过滤掉字符串中的空格、回车(换行)、制表符*/
for (i = 0; i<len; i++)
{
if(buffer[i]!=' ' && buffer[i]!= '\r' && buffer[i]!='\n' && buffer[i]!='\t'))
{
photo[j] = buffer[i];
j++;
}
}
/*将过滤后的字符串转为十六进制*/
len = j/2; //要转换为十六进制的长度
memset(photoHEX,0,sizeof(photoHEX));
DSP_2_HEX(photo,photoHEX,len);
/*保存为二进制图片*/
fp = fopen("D:\\photo.jpg","wb");
if(fp != NULL)
{
fwrite(photoHEX,1,len,fp);
}
fclose(fp);
fp = NULL;
return 1;
}
二、python实现
Python直接以脚本方式,没有写成模块的方式。
# -*- coding: utf-8 -*-
#codeing=utf-8
import struct
"""
打开txt文件,并读出文件内容,保存到str类型的filet变量中
"""
with open("D:\\photo.txt","r") as f:
filet= f.read();
print(type(filet)) #查看filet类型打印为<type 'str'>
strY = '' #建立空字符串保存过滤后的字符串
i = 0
"""
打开二进制文件,并把txt的字符串转换为二进制后写入
"""
with open("D:\\photo.jpg","wb") as g:
for x in filet : #逐个字符迭代
if x != ' ' and x!= '\n' and x!= '\r' and x!= '\t': #过滤掉空格、回车(换行)、制表符
strY += x #将字符串连接到strY
i+=1;
if(i%2 == 0): #每两个字符转换一次为HEX,并写入文件
xHex = int(strY,16) #将两个字符转为HEX “ff ”->0x000000ff
xHex = struct.pack("B",xHex) #将HEX数据转为unsigned char的字符串
g.write(xHex) #write()函数参数只能为str类型
strY = '' #strY 置为空字符串
Struct模块的pack和unpack不在这里介绍。
有这个测试的原因是因为,在嵌入式中读出串口摄像头返回的数据并在仿真模式下在控制台打印了出来。目的把读出来的数据写成图片文件,验证摄像头返回的数据是否正确。虽然本嵌入式中没有文件系统,但可以直接在嵌入式中的仿真模式下直接写成图片文件就可以验证,
/*保存为二进制图片*/
fp = fopen("D:\\photo.jpg","wb");
if(fp != NULL)
{
fwrite(photoHEX,1,len,fp);
}
fclose(fp);
fp = NULL;
结果兜了一大圈来实现。吐槽一下思维僵化。
初学Python写二进制文件的更多相关文章
- 初学python写个自娱自乐的小游戏
一.摘要 当编写完后的代码执行第一次后达到了目标的预期效果,内心有些许满足,但是当突发情况产生后,程序便不能正常运行,于是准备从简单的版本开始出发,综合考虑使用者的需求,和使用过程中会遇到的问题,一步 ...
- 初学Python
初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔&quo ...
- python操作二进制文件
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...
- 无开发经验,初学python
1.无开发经验,初学python 如果你不会其他语言,python是你的第一门语言: A Byte of Python (简明python教程,这个有中文版简明 Python 教程)是非常好的入门 ...
- 用Python写的一个多线程机器人聊天程序
本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...
- 初学 Python(十一)——切片
初学 Python(十一)--切片 初学 Python,主要整理一些学习到的知识点,这次是切片. #-*- coding:utf-8 -*- ''''' 切片 ''' L = ['name','age ...
- 初学Python(九)——函数
初学Python(九)--函数 初学Python,主要整理一些学习到的知识点,这次是函数. 函数定义: # -*- coding:utf-8 -*- #函数的定义 def my_function(x) ...
- 初学Python(五)——元组
初学Python(五)——元组 初学Python,主要整理一些学习到的知识点,这次是元组. #-*- coding:utf-8 -*- #定义元素 t = (1,2,3) #添加元素 #删除元素 #更 ...
- 初学python之感悟
python的强大有目共睹,现将初学python,觉得其中比较重要的知识罗列如下: 类似于数组的东西:列表.元组.集合.字符串以及字典,这几个东西充分体现了python的强大和逆天. 列表: x=[1 ...
随机推荐
- 学习经常遇到的浮动(float)
参考自 小辉随笔: https://www.cnblogs.com/lchsirblog/p/9582989.html 一.什么时候需要使用浮动 最常见的情景是:多个块级元素(如div)需要同一行显示 ...
- html br标签 语法
html br标签 语法 br标签什么意思? 作用:插入一个简单的换行符.广州大理石机械构件 说明:<br> 标签是空标签(意味着它没有结束标签,因此这是错误的:<br>< ...
- vector利用swap()函数进行内存的释放
首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有 ...
- csp-s2019 AFO记
DAY 0 上午出发前大家都很颓废的样子. 我因为还没有实现刷完NOIP专题的所有题的目标而去憨比的学DDP. 最后还是不会,保卫王国是写不成了…… 该走了,学校领导来开了个欢送会,祝福我们从里WA到 ...
- sqli-labs(9)
基于时间的GET单引号盲注 0x01爱之初试探 在我们注入了SQL代码之后,存在以下两种情况: 如果注入的SQL代码不影响后台[数据库]的正常功能执行,那么Web应用的页面显示正确(原始页面). 如果 ...
- 译-使用Scroll Snapping实现CSS控制页面滚动
特别声明,本文翻译自@alligatorio的Control Page Scroll in CSS Using Scroll Snapping一文,受限于译者能力,译文或存在不足,欢迎大家指出.如需转 ...
- 图的普里姆(Prim)算法求最小生成树
关于图的最小生成树算法------普里姆算法 首先我们先初始化一张图: 设置两个数据结构来分别代表我们需要存储的数据: lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说 ...
- 移动开发与PC开发区别
移动开发领域与PC 开发得区别,总结为:3低, 3高,3有限.开发移动程序是应该时刻记住这9个限制. 3低 低处理能力 低分辨率 低速的数据传输能力 ...
- SRCNN 卷积神经网络
2019-05-19 从GitHub下载了代码(这里) 代码量虽然不多,但是第一次学,花了时间还是挺多的.根据代码有跑出结果(基本没有改),但是对于数据集的处理还是看的很懵逼,主要是作者的实现都是用类 ...
- js2flowchart
https://github.com/Bogdan-Lyashenko/js-code-to-svg-flowchart js2flowchart - a visualization library ...