我用Python读取二进制文件。
前面的代码使用.read()函数很顺利
read(4)这就是read4个字节的意思。
结果突然,再用read(4),就显示读取了7个字节。
read(2),就显示读取了4个字节。
这是为啥啊?
下面是全部代码
```python
#Source code for
# -*- coding: utf-8 -*-
import abc#abc模块是AbsructBaseClass的缩写
'''
'''
import os
import json
from typing import Optional, Any
import bz2
import gzip
import numpy as np
from cinrad.constants import MODULE_DIR
from cinrad._typing import Number_T
import struct
# -*- coding: utf-8 -*-
# Author: Puyuan Du
from collections import OrderedDict, defaultdict
from typing import Optional, Union, Any
import datetime
from io import BytesIO
import numpy as np
from xarray import Dataset, DataArray
with open("/mnt/e/config/maps/Z9010_20230512080000Z_HCL_02_164", "r",encoding='ISO-8859-1') as buf:#os.path.join()用来拼接路径gb2312
###########################读公共数据块-通用头块32个字节
#把指标放到8个字节之后
buf.seek(8)#seek这个不具有累加意味是指针,但是read有累加
#读取4个字节是公共数据块-通用头块-04文件类型
a1=buf.read(4).encode()#必须由encode转码成bytes,直接读出来是str
print (a1)
gt = int.from_bytes(a1, byteorder='little', signed=True) # 仅可用于整数的单个数据转换方式是使用 int.from_bytes 函数。
print(gt )
#读取4个字节是公共数据块-通用头块-05产品类型。51代表HCL
a2=buf.read(4).encode()
print (a2)
pt = int.from_bytes(a2, byteorder='little', signed=True) # 仅可用于整数的单个数据转换方式是使用 int.from_bytes 函数。
print(pt )
###########################读公共数据块-站点配置块128个字节
buf.seek(32)#seek这个不具有累加意味是指针,但是read有累加
#读取4个字节是公共数据块-站点配置-01站号。51代表HCL
a3=buf.read(8).encode()
print (a3)
sc = str(a3,'utf-8') # 仅可用于整数的单个数据转换方式是使用 int.from_bytes 函数。
print(sc )
#读取32个字节是公共数据块-站点配置-02站名。51代表HCL
a4=buf.read(32).encode()
print (a4)
sn = str(a4,'utf-8') # 仅可用于整数的单个数据转换方式是使用 int.from_bytes 函数。
print(sn )
#读取4个字节是公共数据块-站点配置-03纬度。51代表HCL
a5=buf.read(4).encode()
print (len(a5))
print (a5)
slat = struct.unpack('f',a5)
print(slat )
a6=buf.read(4).encode()#就是这里,读取4个显示7个,读取3个显示6个,读取2个显示4个。搞得我后面用不了。之前都很正常
print (len(a6))
print (type(a6))
print (a6)
slon = struct.unpack('f',a6)
print(slon)
```