博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初学Python写二进制文件
阅读量:5261 次
发布时间:2019-06-14

本文共 3185 字,大约阅读时间需要 10 分钟。

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

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

转载于:https://www.cnblogs.com/smulngy/p/7488812.html

你可能感兴趣的文章
SWIFT国际资金清算系统
查看>>
关于拷贝构造函数与赋值构造函数的深刻解析
查看>>
Sping注解:注解和含义
查看>>
站立会议第四天
查看>>
用原生JS获取非行间样式
查看>>
toolbox类
查看>>
如何快速掌握一门技术
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
vagrant 同时设置多个同步目录
查看>>
python接口自动化28-requests-html爬虫框架
查看>>
爬虫学习笔记(一)初识爬虫
查看>>
生成随机数的模板
查看>>
SpringMVC文件上传
查看>>
hdu 2093
查看>>
纸上谈兵: 树, 二叉树, 二叉搜索树[转]
查看>>
Mysql 数据库操作
查看>>
SQL表中的自连接定义与用法示例
查看>>
hdu 1032 The 3n + 1 problem
查看>>
static关键字
查看>>
转:linux终端常用快捷键
查看>>