public DztReaderResult Read(string path)
{
//最小头部长度
int MINHEADSIZE = 1024;
DztReaderResult result = null;
//雷达数据
List<float> dztData = new List<float>();
using (FileStream fileStream = File.Open(path, FileMode.Open))
{
// 打开文件并创建一个 BinaryReader 对象
BinaryReader reader = new BinaryReader(fileStream);
// 读取文件内容
//读取header
fileStream.Seek(2, SeekOrigin.Begin);
//数据偏移量
int rh_data = reader.ReadUInt16();
//数据长度
fileStream.Seek(4, SeekOrigin.Begin);
int rh_nsamp = reader.ReadUInt16();
fileStream.Seek(52, SeekOrigin.Begin);
//通道数
int rh_nchan = reader.ReadUInt16();
fileStream.Seek(40, SeekOrigin.Begin);
int rh_rgain = reader.ReadUInt16();
fileStream.Seek(6, SeekOrigin.Begin);
//数据类型,每个数据所占位数
int rh_bits = reader.ReadUInt16();
//whether or not the header is normal or big-->determines offset to data array
int data_offset = rh_data < MINHEADSIZE ? MINHEADSIZE * rh_data : MINHEADSIZE * rh_nchan;
int offset = data_offset - MINHEADSIZE * rh_nchan;
int data_start = MINHEADSIZE * rh_nchan + offset;
fileStream.Seek(data_start, SeekOrigin.Begin);
int dataLength = 0;
if (rh_bits == 8)
{
dataLength = (int)(fileStream.Length - data_start);
}else if (rh_bits == 16)
{
dataLength = (int)((fileStream.Length - data_start) /2);
}
else
{
dataLength = (int)((fileStream.Length - data_start) / 4);
}
for (int i = 0; i < dataLength; i++)
{
switch (rh_bits)
{
case 8:
dztData.Add(reader.ReadByte());
break;
case 16:
dztData.Add(reader.ReadUInt16());
break;
default:
dztData.Add(reader.ReadInt32());
break;
}
}
NDArray dztOutData = np.array(dztData);
dztOutData = dztOutData.reshape(-1, rh_nsamp * rh_nchan);
dztOutData = dztOutData.T;
List<NDArray> arr = new List<NDArray>();
//如果是多通道数据,返回数组
for (int i = 0; i < rh_nchan; i++)
{
arr.Add(dztOutData[new Slice(i * rh_nsamp, (i + 1) * rh_nsamp)]);
}
result = new DztReaderResult(arr, rh_data, rh_nchan, rh_nsamp, rh_rgain,rh_bits);
}
return result;
}
C#读取DZT 瞬变电磁
于 2024-04-28 09:33:21 首次发布