初学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. js dom 添加类

    var sheng = document.getElementById("sheng"); ; sheng.onclick = function() { if(this.paren ...

  2. BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精

    考试的时候切掉了,然而卡精 + 有一个地方忘开 $long long$,完美挂掉 $50$pts. 把式子化简一下,然后直接拿线段树来维护即可. Code: // luogu-judger-enabl ...

  3. eclipse中使用maven搭建多模块项目

    暂时参考:https://blog.csdn.net/u012343297/article/details/79883870

  4. LSTM细节

    为什么使用tanh? 为了克服梯度消失问题,我们需要一个二阶导数在趋近零点之前能维持很长距离的函数.tanh是具有这种属性的合适的函数. 为什么要使用Sigmoid? 由于Sigmoid函数可以输出0 ...

  5. 微信小程序登录 code 40029 天坑

    微信登录时 code 大坑(服务端返回如下代码) {"errcode":40029,"errmsg":"invalid code, hints: [ ...

  6. Qt 静态库与共享库(动态库)共享配置的一个小办法

    对于用 QtCreator 编写静态库,动态库,如何能够以最小的改动, 方便的实现两种形式的库文件生成:可以这麽做: 1)使用想到建立静态库 2)在项目配置文件*.pro  中: TARGET = n ...

  7. 测试常用shell命令

    正则表达式 特殊字符 $ . ' * [ ] ^ | ( ) \ + ? awk使用心得 将抽取域在屏幕上显示和保存到文件中 awk '{print $3}' t1.txt | tee file1.t ...

  8. python数据类型之可hash,不可hash

    可变类型的数据不可哈希,如list,字典:同值不同址,不同值同址   列表,字典可变, 数值.字母.字符串.数字.元组不可变:同值同址,不同值不同址 怎么判断可变不可变 ?   总结:改个值 看id是 ...

  9. HashMap,ConcurrentHashMap相关知识整理

    1.HashMap的存储步骤: 1.传入key和value,判断key是否为null,如果为null,则调用putForNullKey,以null作为key存储到哈希表中: 2. 然后计算key的ha ...

  10. leetcode-mid-backtracking -46. Permutations-NO

    mycode 没有通过,其实只需要把temp.append改为temp+[nums[i]]即可 def permute(nums): def dfs(res,nums,temp): print(num ...