初学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 ...
随机推荐
- sql len函数 CASE WHEN
SELECT LEN('SQL Server LEN') length, LEN('SQL Server LEN ') length_with_trailing_blanks; SELECT (CAS ...
- BZOJ 3193: [JLOI2013]地形生成 计数 + 组合 + 动态规划
第一问: 先不考虑山的高度有相同的:直接按照高度降序排序,试着将每一座山插入到前面山的缝隙中. 当然,这并不代表这些山的相对位置是固定的,因为后面高度更低的山是有机会插入进来的,所以就可以做到将所有情 ...
- ubuntu下恢复被rm删除的文件
ubuntu是文件系统,不像windows系统划分盘符(C/D/E/etc...盘).ubuntu对磁盘划分分区,可以使用extundelete恢复ext3/ext4格式的磁盘分区. 其中,ext3/ ...
- Oracle--单实例数据库迁移到RAC集群服务器(RMAN)
单实例数据库版本:11.2.0.1 RAC实例数据库版本:11.2.0.3 1,在单实例数据库备份文件 RMAN> show all; using target database control ...
- oracle 数据库优化【转载】
版权声明:本文为CSDN博主「咫尺的梦想ing」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/u01305 ...
- sqli-labs(24)
0x1 前言 SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入 .二次注入不是注入两次的意思,请不要混淆 0x2 什么是二阶注入 二阶注入是指客通过构造数据的形式,在浏览器或者 ...
- Vue左滑组件slider的实现
本文链接:https://blog.csdn.net/latency_cheng/article/details/82983000 slider组件与swiper组件不同,slider滑动时并不翻页, ...
- WPF Knowledge Points - 默认视图(DefaultView),CollectionSourceView,CollectionView的区别
这些天一直在做一些关于Treeview的事情,想写出来一些用法和心得.说到集合对象的显示和表现,CollectionSourceView和CollectionView有着至关重要的作用,所以在写Tre ...
- 为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢
常用MIME类型(Flv,Mp4的mime类型设置) 也许你会在纳闷,为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢?这就表明mp ...
- robotframework之使用cookies登陆
有的系统是使用cookies保持登陆的,而RF的Request库里面没有像Selenium2Library里面一样操作cookies的关键字,若接口需要登录则只能用UI自动化先登录,然后再将cooki ...