Python与C数据读取与写入
# -*- coding: cp936 -*-
'''使用array模块读取C语言生成的二进制数据文件,并改变字节顺序
1.C语言生成的二进制文件数据必须为同一类型。
2.先运行topython.exe程序,生成topython.dat数据文件
3.再运行此程序,这个程序先将topytho.dat中的数据一integer读入array,并以列表的方式打印出结果
4.再将此数据改变字节顺序,并写入to_big_endian.dat数据文件。
5.再运行topython.exe程序将big-endian数据打印出来(使用be2le转化后)
'''
import array
# 以二进制的方式打开数据文件
fp = file("c:\\topython.dat","rb")
data = array.array('i')
# 从文件中读入数据
data.fromfile(fp,20)
fp.close()
'''
打印数据
array('i', [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361])
'''
print data.tolist()
'''
打印生成的列表
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]
'''
# 使用python输出big-endian数据
data.byteswap()
print data
fp_be = file('c:\\to_big_endian.dat','wb')
print fp_be
print data.tofile(fp_be)
fp_be.close()
C语言代码:
生成python读取的数据;
显示python字节转化后数据;
#include stdio.h>
#include stdlib.h>
//将little-endian转化为big-endian
int be2le(void* pData,unsigned short i)
{
char c;
char* p = (char*)pData;
c = *p;
*(p) = *(p + 3);
*(p + 3) = c;
c = *(p + 1);
*(p + 1) = *(p + 2);
*(p + 2) = c;
return *(int*)p;
}
int main(int argc, char* argv[])
{
int i = 0;
int data[20] = {0};
//生成0-19的平方数
for(;i sizeof(data)/sizeof(data[0]);i++)
{
data = i * i;
printf("%d\t",data);
}
{
//将data数组中的平方数写入文件topython.dat文件
FILE* fp = fopen("c:\\topython.dat","wb");
fwrite(data,sizeof(int),sizeof(data)/sizeof(data[0]),fp);
fclose(fp);
}
{
//读取python生成的数据
FILE* fp = fopen("c:\\to_big_endian.dat","rb");
int data[20] = {0};
if(fp == NULL)
{
return -1;
}
fread(data,sizeof(int),sizeof(data)/sizeof(data[0]),fp);
for(i = 0; i sizeof(data)/sizeof(data[0]);i++)
{
//打印bigendian数据文件
//printf("%d\t",data);
//注意这里为了在windows上显示正确结果,这里使用了be2le函数
printf("%d\t",be2le(&data,sizeof(int)));
}
fclose(fp);
}
return 0;
}