初学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;

结果兜了一大圈来实现。吐槽一下思维僵化。

时间: 2024-08-25 02:42:15

初学Python写二进制文件的相关文章

初学 Python(十一)——切片

初学 Python(十一)--切片 初学 Python,主要整理一些学习到的知识点,这次是切片. #-*- coding:utf-8 -*- ''''' 切片 ''' L = ['name','age','sex','address','company'] #取前2个 print L[0:2] print L[:2] #取倒数第一个 print L[-1] #取后两个 print L[-2:] #取倒数第二个 print L[-2:-1] print len(L) #隔一个数取一次,从第一个数开

初学Python

初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔"编写开发一种易学易懂高效的语言. Python提供丰富的接口和模块,便于使用其他语言细化,性能提升对要求较高的软件. 以上简单描述了一下Python语言的优点,缺点我就不写了,因为不需要对比,强大的语言自会解决现在几个劣势. 针对于初学者版本选择的问题,因为现在国内大多数在使用2.X版本,个人建议使用3.

初学Python(九)——函数

初学Python(九)--函数 初学Python,主要整理一些学习到的知识点,这次是函数. 函数定义: # -*- coding:utf-8 -*- #函数的定义 def my_function(x): if x>0: return x elif x<0: return -x else: pass #函数的调用 a = my_function(-1) b = my_function(2) c = my_function(0) print a,b,c #空函数,pass为占位符 def empt

Python写的监视工具

最近有个需求,统计录入人员的实际工作时间,想了下,每隔一段时间做一个客户端把用户当前的窗口标题记录下来,定期传给MySQL,之后再用另外一个脚本分析实际的工作时间,初学Python,没写过什么东西,如有错误,望指正. 客户端如下: import win32gui import time import getpass import pythoncom import pyHook import threading import MySQLdb import sys LOG_LIST = []  # 

Python写爬虫-爬甘农大学校新闻

Python写网络爬虫(一) 关于Python: 学过C. 学过C++. 最后还是学Java来吃饭. 一直在Java的小世界里混迹. 有句话说: "Life is short, you need Python!"  翻译过来就是: 人生苦短, 我用Python 究竟它有多么强大,  多么简洁? 抱着这个好奇心, 趁不忙的几天. 还是忍不住的小学了一下.(- - 其实学了还不到两天) 随便用一个"HelloWorld"的例子 //Java class Main{ pu

无开发经验,初学python

1.无开发经验,初学python   如果你不会其他语言,python是你的第一门语言: A Byte of Python (简明python教程,这个有中文版简明 Python 教程)是非常好的入门教程. Learn Python the Hard Way (Zed Shaw的免费教程,个人强烈推荐) Python, Django and Flask教程: Real Python (收费,需购买) short 5 minute video 解释了为什么你的出发点应该是要完成什么项目,或者解决什

使用Cython为Python写扩展1:初识Cython

使用Cython为Python写扩展1:初识Cython Cython使为Python写C扩展就如同写Python代码一样简单.广泛用于数学软件包,SAGE公司,作为执行快速,可扩展的运算.它提供了安全和可维护的方法通过自动生成所需代码来构建原生Python模块. 我们经常会使用Cython将C/C++实现的系统绑定到Python中,这样我们就可以使用Python来处理高级别逻辑,原生模块来处理底层代码. 关于示例 代码 http://git.oschina.net/erhuabushuo/le

初学Python(五)——元组

初学Python(五)——元组 初学Python,主要整理一些学习到的知识点,这次是元组. #-*- coding:utf-8 -*- #定义元素 t = (1,2,3) #添加元素 #删除元素 #更新元素 #由于tuple一旦创建就是不可变的,所以不能添加元素也不能删除元素.更新元素 #查找元素,和list类似,下标法 print t[0] print t[2] print t #定义空元组 t = () ''''' 上面的为定义元素,不是修改元素, t变量指向了空元组.这是创建语句, 它在遇

初学Python常见异常错误,总有一处你会遇到!

初学Python常见错误 忘记写冒号 误用= 错误 缩紧 变量没有定义 中英文输入法导致的错误 不同数据类型的拼接 索引位置问题 使用字典中不存在的键 忘了括号 漏传参数 缺失依赖库 使用了python中对关键词 编码问题 1. 忘记写冒号 在 if.elif.else.for.while.def语句后面忘记添加 : age = 42 if age == 42 print('Hello!') File "<ipython-input-19-4303141d6f97>", l