C与Java 文件数据交互

14 篇文章 0 订阅

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、付费专栏及课程。

余额充值