当前位置:编程学习 > C#/ASP.NET >>

关于C#文件的读取~~~自定义文件格式~~~

最近做一个项目~
项目里面有一种文件格式——SGY~
是数据文件~  不知道怎么读~  望大虾赐教~~~
  文件格式说明如下:



*.SGY文件格式说明:(以下偏移量以文件头0为基地址)
偏移 长度 内容
0 3200 卷头定义
3200 400 作业定义
以下重复n道的道定义和道数据定义
3600 240 道定义
3840 Samples*4 道数据

*.SGY文件中作业定义格式说明:(以下偏移量以作业头3200为基地址)
起始 长度 类型 内容
0 4 LongInt 工号
4 4 LongInt 线数
8 4 LongInt 卷号
12 2 SmallInt 每条记录的道数
14 2 SmallInt 每条记录的道数(备用)
16 2 SmallInt 样点间的时间间隔(磁带)ms
18 2 SmallInt 样点间的时间间隔(字段)ms
20 2 SmallInt 每道的样点数
22 2 SmallInt 每道的样点数(字段)
24 2 SmallInt 数据格式代码
*.SGY文件中作业定义格式说明:(以下偏移量以作业头3600为基地址)
起始 长度 类型 内容
0 4 LongInt 序号
4 4 LongInt 线号(波阻抗)
20 4 LongInt 道号
72 4 LongInt 坐标X
76 4 LongInt 坐标Y
114 2 SmallInt 每道的样点数
116 2 SmallInt 样点的间隔(ms)
220 4 LongInt 线号(地震)
以下重复n道的道定义和道数据定义
3600 240 道定义
3840 Samples*4 道数据

EBCDIC短整型格式说明: IEEE短整形格式说明:
Byte1: 高字节 Byte1: 低字节
Byte2: 低字节 Byte2: 高字节

EBCDIC长整型格式说明: IEEE长整形格式说明:
Byte1: 高字节 Byte1: 低字节
Byte2: 次高字节 Byte2: 次低字节
Byte3: 次低字节 Byte3: 次高字节
Byte4: 低字节 Byte4: 高字节

EBCDIC单精度实型格式说明:
Byte1: 符号位和指数部分
  Bit7: 符号位,1:负 0:正
  Bit6..Bit0: 加上了64后的指数,亦即:减64后为实际的指数值,注:底数为16
Byte2: 尾数部分
  Bit7: 0.5位,亦即:若为1,表示尾数加0.5, 即:1.0/(2.0^1)
  Bit6: 0.25位,亦即:若为1,表示尾数加0.25, 即:1.0/(2.0^2)
  ……
  Bit0: 0.00390625位,亦即:若为1,表示尾数加0.00390625, 即:1.0/(2.0^8)
Byte3: 尾数部分
  Bit7: 若为1,表示尾数加 1.0/(2.0^9)
  Bit6: 若为1,表示尾数加 1.0/(2.0^10)
  ……
  Bit0: 若为1,表示尾数加 1.0/(2.0^16)
Byte4: 尾数部分
  Bit7: 若为1,表示尾数加 1.0/(2.0^17)
  Bit6: 若为1,表示尾数加 1.0/(2.0^18)
  ……
  Bit0: 若为1,表示尾数加 1.0/(2.0^24)

--------------------编程问答-------------------- 顶啊啊啊~
--------------------编程问答-------------------- 5.1.1.1 三维波阻抗数据文件
注:1.取名规则:<工区名>.SGY,如:QMQ.SGY
    2.存放位置:WA\Source
    3.文件格式:工作站SGY格式
    4.用途:用于转换为微机格式SE3格式的工区数据
标准的SEG-Y格式如下:
 
非标准的SEG-Y格式如下:
 
卷头(ASCII 区域): 3200字节(0~3100,40条记录 x 80 字节/每条记录)。
卷头(二进制数区域): 400字节(3200~3599)。
偏移+3200 长度 类型 内容
0 4 LongInt 工号
4 4 LongInt 线数
8 4 LongInt 卷号
12 2 SmallInt 字节—每个记录的数据道数(每炮道数或总道数)
16 2 SmallInt 采样间隔(μs)
20 2 SmallInt 样点数/每道(道长)
24 2 SmallInt 数据样值格式码,1:32位浮点、2:32位整形、3:16位整形
54 2 SmallInt 计量系统:1-米, 2-英尺
60* 2 SmallInt 文件中的道数(总道数)
68* 2 SmallInt 数据域(性质):0-时域,1-振幅,2-相位谱

3261-3600   未做规定
注:偏移地址后面有“*”的表示非标准定义。
道头: 240字节(每道一个道头)
偏移 长度 类型 内容
0 4 LongInt 一条测线中的道顺序号,如果一条测线有若干卷磁带,顺序号连续递增。
4 4 LongInt 在本卷磁带中的道顺序号。每卷磁带的道顺序号从l开始。
8 4 LongInt 在原始野外记录中的道号(炮号)。
12 4 LongInt 在原始野外记录中的道号。
16 4 LongInt 测线内炮点桩号(在同一个地面点有多于一个记录时使用)。
20 4 LongInt CMP号(或CDP号)。(弯线=共反射面元号)
24 4 LongInt 在CMP道集中的道号(在每个CMP道集中道号从1开始)。
28* 2 SmallInt 道识别码:l=地震数据;4=爆炸信号;7=计时信号;2=死道5=井口道;8=水断信号;                             3=无效道(空道);6=扫描道;9…N=选择使用(N=32767)。
30 2 SmallInt 构成该道的垂直叠加道数(1是一道;2是两道相加;…)
32 2 SmallInt 构成该道的水平叠加道数(1是一道;
34 2 SmallInt 数据类型:1=生产
36 4 LongInt 从炮点到接收点的距离(如果排列与激发前进方向相反取负值)
40 4 LongInt 接收点的地面高程。高于海平面的高程为正,低于海平面为负(cm)
44 4 LongInt 炮点的地面高程(cm)
48 4 LongInt 炮井深度(正数,cm)
52 4 LongInt 接收点基准面高程(cm)
56 4 LongInt 炮点基准面高程(cm)
60 4 LongInt 炮点的水深(cm)。
64 4 LongInt 接收点的水深(cm)。
68 2 SmallInt 对41一68字节中的所有高程和深度应用此因子给出真值。比例因子=l,土10,土100,土1000或者 土10000。如果为正,乘以因子;如果为负,则除以因子。(此约定中= -100)。
70 2 SmallInt 对73—88字节中的所有坐标应用此因子给出真值。比例因子=1,土10,土[00,土1000或者土10000。如果为正,乘以因子;如果为负,则除以因子。(此约定中= -10)。
72 4 LongInt 炮点坐标—X(分米)。(如果坐标单位是弧度•秒。
76 4 LongInt 炮点坐标—Y(分米)。X值代表径度,Y值代表。
80 4 LongInt 接收点坐标—X(分米)。纬度;正值代表格林威。
84 4 LongInt 接收点坐标—Y(分米)。治子午线东或者赤道北的秒数。负值则为西或者南的秒数)。
88 2 SmallInt 坐标单位。
90 2 SmallInt 接收点下风化层速度(低速带速度,M/S)。
92 2 SmallInt 接收点下次风化层速度(降速带速度,M/S)。
94 2 SmallInt 震源处的井口时间(ms)。
96 2 SmallInt 接收点处的井口时间(ms)。
98 2 SmallInt 炮点的野外一次静校正值(ms)。
100 2 SmallInt 接收点的野外一次静校正值(ms)。
102 2 SmallInt 总野外一次静校正量(若未用静校时为零,ms)。
104 2 SmallInt 延迟时间—A,以ms表示。240字节的道标识的结束和时间信号之间的时间。如果时间信号出现在道头结束之前为正。如果时间信号出现在道头结束之后为负。时间信号就是起始脉冲,它记录在辅助道上或者由记录系统指定。
106 2 SmallInt 时间延迟—B,以ms表示。为时间信号和起爆之间的延迟时间,正可负。
108 2 SmallInt 延迟记录时间,以ms表示。震源的起爆时间和开始记录数据样点之间的时间(深水时,数据记录不从时间零开始)。
110 2 SmallInt 起始切除时间(ms)。
112 2 SmallInt 结束切除时间(ms)。
114* 2 SmallInt 本道的采样点数。
116* 2 SmallInt 本道的采样间隔,以us表示。
118 2 SmallInt 野外仪器的增益类型:l=固定增益;2=二进制增;3=浮点增益;4…N=选择使用。
120 2 SmallInt 仪器增益常数。
122 2 SmallInt 仪器起始增益(db)(固定增益)。
124 2 SmallInt 相关码。
126 2 SmallInt 127—128 。
128 2 SmallInt 结束扫描频率。
130 2 SmallInt 扫描长度,以ms表示。
132 2 SmallInt 扫描类型:1=线性;2=抛物线;3=指数;4=其他。
134 2 SmallInt 扫描道起始斜坡长度,以ms表示。
136 2 SmallInt 扫描道终了斜坡长度,以ms表示。
138 2 SmallInt 斜坡类型:1=线性;2=COS²;3=其他。
140 2 SmallInt 滤假频的频率(如果使用)。
142 2 SmallInt 滤假频的陡度。
144 2 SmallInt 陷波频率(如果使用)。
146 2 SmallInt 陷波陡度。
148 2 SmallInt 低截频率(如果使用)。
150 2 SmallInt 高截频率(如果使用)。
152 2 SmallInt 低截频率陡度。
154 2 SmallInt 高截频率陡度。
156 2 SmallInt 数据记录的年。
158 2 SmallInt 日。
160 2 SmallInt 小时(24小时制)。
162 2 SmallInt 分。
164 2 SmallInt 秒。
166 2 SmallInt 时间代码:1=当地时间;2=格林威治时间。
168 2 SmallInt 道加权因子(最小有效位定义为2**(—N),N=0,1,2,…,32767)。
170 2 SmallInt 覆盖开关位置1处的检波器串(道)号。
172 2 SmallInt 在原始野外记录中第一道的检波器串号。
174 2 SmallInt 在原始野外记录中最后一道的检波器串号。
176 2 SmallInt 缺口大小(覆盖滚动的总道数);改为:(=1,单边激发;=2,中间激发。)。
178 2 SmallInt 在测线的开始或者结束处的覆盖斜坡位置:1=在后面(下行); 2=在前面(上行);改为:=0,无坐标;=1,有高程;=2,有坐标和高程。
180 4 LongInt 弯线或直测线中每个共反射点的X坐标(分米)。
184 4 LongInt 弯线或直测线中每个共反射点的Y坐标(分米)。
188 4 LongInt 弯线中每个共反射面元中点的X坐标(分米)。
192 4 LongInt 弯线中每个共反射面元中点的Y坐标(分米)。
196 4 LongInt 弯线中输出剖面段的X坐标(分米)。
200 4 LongInt 弯线中输出剖面段的Y坐标(分米)。
204 2 SmallInt 测线内接收点桩。
206 2 SmallInt 站点间距或道间距(分米)。
208 2 SmallInt 道数/每炮。
210 2 SmallInt 炮点下低速带速度(M/S)。
212 2 SmallInt 炮点下降速带速度(M/S)。
214 2 SmallInt CMP(CDP)点或共面元中点间距(分米)。
216 2 SmallInt 测线内有效站点总数。
218 2 SmallInt 剖面内CMP(CDP)点或共面元点总数。
220 2 SmallInt 炮点剩余静校正量(ms)。
222 2 SmallInt 接收点剩余静校正量(ms)。
224 2 SmallInt 总剩余静校正量(ms)。
226 2 SmallInt 炮点下低速带厚度(分米)。
228 2 SmallInt 接收点下低速带厚度(分米)。
230 2 SmallInt 弯线中该道列号。
232 2 SmallInt 弯线中该道行号。
234 2 SmallInt 弯线中输出剖面段的段号。
236 4 LongInt 测线内的总道数。
道数据:起始位置3840
浮点4字节(实型数) / 每个样值,按二进制格式存放。
SEGY数据存储格式有两种:IEEE和IBM。
IEEE和IBM的整型存储与微机格式的存储不同之处在于IEEE和IBM的高字节在前、低字节在后,即BigEndian,微机则是低字节在前、高字节在后,即LittleEndian 。IEEE和IBM的32位、16位的整型转换成微机格式。
IEEE短整型 IBM短整型 微机短整型
Byte1 低字节 低字节 高字节
Byte2 高字节 高字节 低字节
IEEE长整型 IBM长整型 微机长整型
Byte1 低字节 低字节 高字节
Byte2 次低字节 次低字节 次高字节
Byte3 次高字节 次高字节 次低字节
Byte4 高字节 高字节 低字节
IEEE格式32位浮点型与微机格式的32位浮点型相比:只要进行高、低位交换即可。







IBM格式32位浮点型要转换位微机格式:需要分拆字位,重新进行数值计算才能得到正确的微机数值。格式说明如下:
Byte1: 符号位和指数部分
  Bit7: 符号位,1:负 0:正
  Bit6..Bit0: 加上了64后的指数,亦即:减64后为实际的指数值,注:底数为16
Byte2: 尾数部分
  Bit7: 0.5位,亦即:若为1,表示尾数加0.5, 即:1.0/(2.0^1)
  Bit6: 0.25位,亦即:若为1,表示尾数加0.25, 即:1.0/(2.0^2)
  ……
  Bit0: 0.00390625位,亦即:若为1,表示尾数加0.00390625, 即:1.0/(2.0^8)
Byte3: 尾数部分
  Bit7: 若为1,表示尾数加 1.0/(2.0^9)
  Bit6: 若为1,表示尾数加 1.0/(2.0^10)
  ……
  Bit0: 若为1,表示尾数加 1.0/(2.0^16)
Byte4: 尾数部分
  Bit7: 若为1,表示尾数加 1.0/(2.0^17)
  Bit6: 若为1,表示尾数加 1.0/(2.0^18)
  ……
  Bit0: 若为1,表示尾数加 1.0/(2.0^24)
--------------------编程问答-------------------- 楼上。。 --------------------编程问答-------------------- ......... --------------------编程问答-------------------- 帮你顶起来,我最近也碰到这个问题,虽说格式跟楼主的不一样
不过也差不多了,都是这种自定义的数据文件。

有哪位高人能说说大概的思路或者想法就可以了。 --------------------编程问答-------------------- 为什么不用BinaryReader?MSDN里面应该是写的很详细了吧。 --------------------编程问答-------------------- 看看Big Endian 和 Little Endian 以及IBM 浮点和IEEE浮点等方面的知识, 

前者涉及字节交换,后者需要用到位运算 --------------------编程问答-------------------- 补充一点:还有ASCII和EDCBIC编码的问题
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,