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;
}