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