c java 数据交互_C与Java 文件数据交互

C与Java文件数据交互真麻烦,字节位顺问题、字符串结束问题,费了不少时间,总算搞出个简单的测试。

以下为C代码

header.h

union i64i8

{

int64_t a;

int8_t b[8];

};

union i32i8

{

int32_t a;

int8_t b[4];

};

union i16i8

{

int16_t a;

int8_t b[2];

};

/**

* 测试CPU位序

* @return 0:高位在前 1:低位在前

*/

int testCPUEndian();

/**

* 将一个int32转成高位在前的int8[4]

*/

void toBigEndian(int32_t, int8_t*);

void t8();

impl0.cpp

#include "header.h"

int testCPUEndian()

{

union

{

int32_t i;

int8_t b[4];

}a;

a.i = 0x00000001;

return (0x01 == a.b[0]? 1: 0);

}

void toBigEndian(int32_t i,int8_t* b)

{

union _to

{

int32_t i;

int8_t b[4];

};

// size_t c;

_to* t;

t = (union _to*)malloc(sizeof(union _to));

t->i = i;

if(1 == testCPUEndian())

{

// t.i = (t.b[0] << 24) | (t.b[1] << 16) | (t.b[2] << 8) | (t.b[3]);

// b[0] = (t.b[0] << 24);

// b[1] = (t.b[1] << 16);

// b[2] = (t.b[2] << 8);

// b[3] = (t.b[3]);

// for(c = 3; c >= 0; c--)

// {

// *b++ = t->b[c];

// }

b[0] = t->b[3];

b[1] = t->b[2];

b[2] = t->b[1];

b[3] = t->b[0];

}

else

{

b[0] = t->b[0];

b[1] = t->b[1];

b[2] = t->b[2];

b[3] = t->b[3];

// for(c = 0; c < 4; c++)

// {

// *b++ = t->b[c];

// }

}

free(t);

}

impl1.cpp

#include "header.h"

void t8()

{

struct Info

{

i32i8 id;

char name[20];

i32i8 sex;

};

Info* info;

const char* file = "d:\\test\\2.dat";

FILE* fileOut;

int8_t* buffer;

fileOut = fopen(file, "wb+");

if(!fileOut)

{

printf("create|open file '%s' fail.", file);

return;

}

info = (Info*)malloc(sizeof(Info));

info->id.a = 10903001;

strcpy(info->name, "Max.K");

info->sex.a = 0x01;

buffer = (int8_t*)malloc(4);

toBigEndian(info->id.a, buffer);

fwrite(buffer, 1, 4, fileOut);

free(buffer);

fwrite(info->name, 1, 20, fileOut);

buffer = (int8_t*)malloc(4);

toBigEndian(info->sex.a, buffer);

fwrite(buffer, 1, 4, fileOut);

free(buffer);

free(info);

fclose(fileOut);

}

main.cpp

#include "header.h"

int main()

{

if(1) t8();

return 0;

}

以下是Java代码:

Info.java

package org.sl.bean;

import org.sl.util.Utility;

public class Info {

private int id;

private String name;

private int sex;

public void setId(int id){

this.id = id;

}

public void setId(byte[] buff, int start){

this.id = Utility.byte2Int(buff, start);

}

public void setName(byte[] buff, int start, int length){

int len = 0;

for(int i = start; i < length; i++, len++)

if('\0' == buff[i]) break;

this.name = new String(buff, start, len);

}

public void setName(String name){

this.name = name;

}

public void setSex(byte[] buff, int start){

this.sex = Utility.byte2Int(buff, start);

}

public void setSex(int sex){

this.sex = sex;

}

public int getId(){

return id;

}

public String getName(){

return name;

}

public int getSex(){

return sex;

}

}

Test1.java

static void t5(){

InputStream in = null;

byte[] buffer = new byte[256];

Info info = new Info();

try{

in = new FileInputStream("d:\\test\\2.dat");

in.read(buffer, 0, 4);

info.setId(buffer, 0);

in.read(buffer, 0, 20);

info.setName(buffer, 0, 20);

in.read(buffer, 0, 4);

info.setSex(buffer, 0);

in.close();

}catch(Exception ex){

ex.printStackTrace();

}

System.out.println("id:" + info.getId() +

" name:" + info.getName() +

" sex:" + info.getSex());

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值