初学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写二进制文件的更多相关文章

  1. 初学python写个自娱自乐的小游戏

    一.摘要 当编写完后的代码执行第一次后达到了目标的预期效果,内心有些许满足,但是当突发情况产生后,程序便不能正常运行,于是准备从简单的版本开始出发,综合考虑使用者的需求,和使用过程中会遇到的问题,一步 ...

  2. 初学Python

    初学Python 1.Python初识 life is short you need python--龟叔名言 Python是一种简洁优美语法接近自然语言的一种全栈开发语言,由"龟叔&quo ...

  3. python操作二进制文件

    有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...

  4. 无开发经验,初学python

    1.无开发经验,初学python   如果你不会其他语言,python是你的第一门语言: A Byte of Python (简明python教程,这个有中文版简明 Python 教程)是非常好的入门 ...

  5. 用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

  6. 初学 Python(十一)——切片

    初学 Python(十一)--切片 初学 Python,主要整理一些学习到的知识点,这次是切片. #-*- coding:utf-8 -*- ''''' 切片 ''' L = ['name','age ...

  7. 初学Python(九)——函数

    初学Python(九)--函数 初学Python,主要整理一些学习到的知识点,这次是函数. 函数定义: # -*- coding:utf-8 -*- #函数的定义 def my_function(x) ...

  8. 初学Python(五)——元组

    初学Python(五)——元组 初学Python,主要整理一些学习到的知识点,这次是元组. #-*- coding:utf-8 -*- #定义元素 t = (1,2,3) #添加元素 #删除元素 #更 ...

  9. 初学python之感悟

    python的强大有目共睹,现将初学python,觉得其中比较重要的知识罗列如下: 类似于数组的东西:列表.元组.集合.字符串以及字典,这几个东西充分体现了python的强大和逆天. 列表: x=[1 ...

随机推荐

  1. java中System类

    System作为系统类,在JDK的java.lang包中,可见它也是一种java的核心语言特性.System类的构造器由private修饰,不允许被实例化.因此,类中的方法也都是static修饰的静态 ...

  2. MySQL教程-MyISAM和InnoDB的区别

    MySQL的表类型MyISAM和InnoDB之间的最大区别是,InnoDB的支持事务.兄弟连教育( )来给大家做个对比: InnoDB支持一些新的功能:交易,行级锁,外键 InnoDB是高容量,高性能 ...

  3. Python学习:Python设计模式-单例模式

    一.单例模式存在的意义 在这里的单例就是只有一个实例(这里的实例就像在面向对象的时候,创建了一个对象也可以说创建了一个实例),只用一个实例进行程序设计,首先我们可以了解一下什么时候不适合使用单例模式, ...

  4. 【bzoj2763】[JLOI2011]飞行路线

    *题目描述: Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一 ...

  5. 【错误记录】windows python 路径中的一个转义错误:'rawunicodeescape' codec can't decode bytes in position 112-113: truncated \uXXXX

    ur"D:\work\结构化\CSV\useful\内容.csv" 报错 编码错误原因,当路径中有\u这种字串时,即使是包含在r"" 中也会进行转义,然后转义出 ...

  6. PHPStrom 配置DataSource来管理数据库

    在使用phpstrom的时候经常会连接数据库,使用phpstrom自带的工具,可以连接到mysql数据库,管理和查看mysql,非常方便 这个连接是官方文档教你如何配置http://www.jetbr ...

  7. jQuery file upload cropper的流程

    https://tkvw.github.io/jQuery-File-Upload/basic-plus-editor.html 最开始初始化jquery.ui.widget.js中的factory( ...

  8. scss 用法 及 es6 用法讲解

    scss 用法的准备工作,下载 考拉 编译工具 且目录的名字一定不能出现中文,哪里都不能出现中文,否则就会报错 es6 用法 let 和 const  let  声明变量的方式 在 {} 代码块里面才 ...

  9. C# 格式化XML方法

    /// <summary> /// 格式化XML方法 /// </summary> public class UXMLFormat { public static string ...

  10. iOS UICollectionView数据少导致不能滚动

    有时候UICollectionView会遇到不能滑动的情况,但是我们并没有代码明确禁止这个东西的滑动效果,这个是苹果系统的小漏洞. 解决办法: 横向滑动的 collectionView.alwaysB ...