初学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 ...
随机推荐
- Jenkins-ssh远程执行nohup- java无法退出
一,初步 #执行方式 ssh 192.168.2.103 " nohup java -jar /home/a/ipf/ight/feedback/ixxxedback-platform-1. ...
- ubuntu 7z解压
安装方法: sudo apt-get install p7zip 解压文件: 7z x manager.7z -r -o /home/xx 解释如下: x 代表解压缩文件,并且是按原始 ...
- end of sleepyhead
- 结合webpack实现children子路由,抽离路由模块
demo结构 package.json.webpack.config.js.index.html与上一篇博客相同. main.js // 这是项目的入口js文件 // import $ from 'j ...
- Android图片缩放 指定尺寸
//使用Bitmap加Matrix来缩放 public static Drawable resizeImage(Bitmap bitmap, int w, int h) { ...
- [51nod1383&1048]整数分解为2的幂:DP
算法一 分析 \(f[x]=f[x-1]+f[x/2] \times [x \equiv 0 \mod 2],O(n)\) 代码 n=int(input()) f=[0]*(n+5) f[0]=1 m ...
- sqli-labs(12)
0X01摘要体现(小编这里傻逼了 可以直接用group_concat函数绕过显示问题我还在用limit绕过) 还是这个模块 我们很熟徐那么先来尝试一下 单引号加入 无报错信息 哦豁 加入双引号试试呐 ...
- Mybatis 自动生成mapper文件
在pom.xml下的<build>内加入: <build> <plugins> <plugin> <groupId>org.mybatis. ...
- linux可用的跨平台C# .net standard2.0 写的高性能socket框架
能在window(IOCP)/linux(epoll)运行,基于C# .net standard2.0 写的socket框架,可使用于.net Framework/dotnet core程序集,.使用 ...
- Mybaits成长之路
今天刚开始接触mybaits,接下来介绍mybaits的demo的建立 1根据数据库表定义一个实体类Employee package com.atguigu.mybatis.bean; public ...