思路是整一个结构体,然后先读ocp那十六个字节,里面下标2 3 4 5 6 7是有用的下标二位三位是判断后面tlv总长度,下标四位五位六位七位是判断送出地址和
接收地址的有效就判断有效TlV,然后再把有效tlv的value找出来写进文件
读取二进制文件将文件里的数据有效值写入二进制文件
文件是导出的OCP传输协议+TLV数据。
OCP头中送出地址为0x0401,接受地址为0x2C01的是有效command,其余为废command。
ocp头:
列:00 02 00 07 04 01 2C 01 00 02 39 02 00 00 00 00一个OCP头总共16字节
其中00 07为ocp长度指的是后面所有TLV总长度len为7,00为高位07为低位,04 01 2C 01为送出地址和接收地址,此题OCP有用的字节就这几个
ocp头后面跟着TLV
TLV:00 01 03 01 02 01,其中00 01为tag ,03为length, 01 02 01 为value,length代表value长度,有效command中,TAG为0x0028或者TAG为0x0029的是有效TLV,
其余为无效TLV。
将有效command中的有效TLV中的value部分按顺序保存到tlv.bin当中。
文件中文件的字节序。在windows下如果直接读取2字节或者4字节的变量,得到的数字与预期相反。如果需要转换16位字节序,可以用下面的函数。
static inline short change_endain_16(unsigned short usIn)
{
return ((usIn & 0xFF) << 8) | ((usIn & 0xFF00) >> 8);
}
思路是整一个结构体,然后先读ocp那十六个字节,里面下标2 3 4 5 6 7是有用的下标二位三位是判断后面tlv总长度,下标四位五位六位七位是判断送出地址和接收地址的有效就判断有效TlV,然后再把有效tlv的value找出来写进文件
1、读取二进制文件数据的方法: intc (char* filename);//读取文件名
2、 C 语言对二进制文件读写数据的格式: voida (char* filename, char* fscanf_ t args);//定义一个字符串变量,用来存放文件的数据,然后再定义一个指向文件数据的指针变量,用来指向这个字符串变量的地址
数据大小端问题,windows和大多数设备的大小端表示是反的
一般二进制文件的存储都是数据流,那么如何将数据流截取下来存到我们所需要的的二维数组
```c
#include<stdio.h>
#include "su.h"
#include "segy.h"
int main()
{
//input written by LEE
//read the file (binary)
FILE *fp;
float **buffer;
int nx=200,nz=200,iz,ix,x,y;
buffer=alloc2float(nz,nx);/*这里可以自己去开辟空间,
这个函数是seismic unix中的 这个函数的意义就是
float buffer[nz][nx];
*/
fp=fopen("v.bin","rb+");
//find the beginning of the file
fseek(fp, 0, sizeof(float));
//read the data
for(ix=0;ix<nx;ix++)
for(iz=0;iz<nz;iz++)
{
fread(&buffer[iz][ix],sizeof(float),nz,fp);
}
// output(the value in the binary)
printf("input the coordinates:");
scanf("%d %d",&x,&y);
printf("vlocity[%d][%d]=%f\n",y+1,x+1,buffer[y][x]);
fclose(fp);
}