营销型网站审定标准,建设网站需要准备什么手续,抢先注册网站域名卖掉,网站播放功能难做吗前言前段时间使用Python解析IDX文件格式的MNIST数据集#xff0c;需要对二进制文件进行读取操作#xff0c;其中我使用的是struct模块。查了网上挺多教程都写的挺好的#xff0c;不过对新手不是很友好#xff0c;所以我重新整理了一些笔记以供快速上手。注#xff1a;教程…前言前段时间使用Python解析IDX文件格式的MNIST数据集需要对二进制文件进行读取操作其中我使用的是struct模块。查了网上挺多教程都写的挺好的不过对新手不是很友好所以我重新整理了一些笔记以供快速上手。注教程中以下四个名词同义二进制流、二进制数组、字节流、字节数组快速上手在struct模块中将一个整型数字、浮点型数字或字符流(字符数组)转换为字节流(字节数组)时需要使用格式化字符串fmt告诉struct模块被转换的对象是什么类型比如整型数字是i浮点型数字是f一个ascii码字符是s。def demo1():# 使用bin_buf struct.pack(fmt, buf)将buf为二进制数组bin_buf# 使用buf struct.unpack(fmt, bin_buf)将bin_buf二进制数组反转换回buf# 整型数 - 二进制流buf1 256bin_buf1 struct.pack(i, buf1) # i代表integerret1 struct.unpack(i, bin_buf1)print bin_buf1, , ret1# 浮点数 - 二进制流buf2 3.1415bin_buf2 struct.pack(d, buf2) # d代表doubleret2 struct.unpack(d, bin_buf2)print bin_buf2, , ret2# 字符串 - 二进制流buf3 Hello Worldbin_buf3 struct.pack(11s, buf3) # 11s代表长度为11的string字符数组ret3 struct.unpack(11s, bin_buf3)print bin_buf3, , ret3# 结构体 - 二进制流# 假设有一个结构体# struct header {# int buf1;# double buf2;# char buf3[11];# }bin_buf_all struct.pack(id11s, buf1, buf2, buf3)ret_all struct.unpack(id11s, bin_buf_all)print bin_buf_all, , ret_all输出结果如下demo1输出结果详解struct模块主要函数struct模块中最重要的三个函数是pack(), unpack(), calcsize()# 按照给定的格式化字符串把数据封装成字符串(实际上是类似于c结构体的字节流)string struct.pack(fmt, v1, v2, ...)# 按照给定的格式(fmt)解析字节流string返回解析出来的tupletuple unpack(fmt, string)# 计算给定的格式(fmt)占用多少字节的内存offset calcsize(fmt)struct中的格式化字符串struct中支持的格式如下表FormatC TypePython字节数xpad byteno value1ccharstring of length 11bsigned charinteger1Bunsigned charinteger1?_Boolbool1hshortinteger2Hunsigned shortinteger2iintinteger4Iunsigned intinteger or lon4llonginteger4Lunsigned longlong4qlong longlong8Qunsigned long longlong8ffloatfloat4ddoublefloat8schar[]string1pchar[]string1Pvoid *long注1q和Q只在机器支持64位操作时有意思注2每个格式前可以有一个数字表示个数注3s格式表示一定长度的字符串4s表示长度为4的字符串但是p表示的是pascal字符串注4P用来转换一个指针其长度和机器字长相关注5最后一个可以用来表示指针类型的占4个字节为了同c中的结构体交换数据还要考虑有的c或c编译器使用了字节对齐通常是以4个字节为单位的32位系统故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下CharacterByte orderSize and alignmentnativenative 凑够4个字节nativestandard 按原字节数little-endianstandard 按原字节数big-endianstandard 按原字节数!network ( big-endian)standard 按原字节数使用方法是放在fmt的第一个位置就像5s6sif参考