c与java数据传输

说明


当需要java调用c代码时,如果不想用jni技术,可考虑将数据存储为文本格式。但考虑到c处理字符串过于繁琐,比如就没有类似的split函数方法。同时你需要处理的东西统统都是数值类型的时候,不妨将数据都转化为二进制的格式。或许更进一步转化为json格式.

代码


这里是定义了一个数据结构,用于处理数据


//c代码

struct LonglyRiceInput{
	double KWX ;
	double MDP;
	double DIST[201][201];
	double ELEV[201][201];
	double HG[2];
	double WN;
	double EN0;
	double GME;
	double ZGND;
	double KLIM;
	double EPS;
	double SGM; 

};
int myread(LonglyRiceInput & in)
{

	FILE * fd = fopen("D:\\workspace\\net\\input","rb");

	if ( fd != NULL)
	{
		//fread(&in.HG, sizeof(double),2,fd);
		fread(&in.HG, sizeof(unsigned char) * 8, 2, fd);
		fread(&in.WN, sizeof(unsigned char) * 8, 1, fd);
		fread(&in.EN0, sizeof(unsigned char) * 8, 1, fd);
		fread(&in.GME, sizeof(unsigned char) * 8, 1, fd);
		fread(&in.ZGND, sizeof(unsigned char) * 8, 1, fd);
		fread(&in.KLIM, sizeof(unsigned char) * 8, 1, fd);
		fread(&in.EPS, sizeof(unsigned char) * 8, 1, fd);
		fread(&in.SGM, sizeof(unsigned char) * 8 ,1, fd);
	}
	else
	{
		return 0;
	}

	if( fd != NULL)
	{
		fclose(fd);
	}

	return 1;
}

//java 代码

package wifimodel;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class TestBinary {

	public static byte[] double2Bytes(double d) {
		long value = Double.doubleToRawLongBits(d);
		byte[] byteRet = new byte[8];
		for (int i = 0; i < 8; i++) {
			byteRet[i] = (byte) ((value >> 8 * i) & 0xff);
		}
		return byteRet;
	}
	
	public static class LonglyRiceInput{
		double KWX ;
		double MDP;
		double DIST[][];
		double ELEV[][];
		double HG[];
		double WN;
		double EN0;
		double GME;
		double ZGND;
		double KLIM;
		double EPS;
		double SGM; 

	};

	public static void addByteList(List<Byte> dataList, double v){
		byte[] bytes = double2Bytes(v);
		for( int i = 0; i < bytes.length; i ++){
			dataList.add(bytes[i]);
		}
		
		return;
	}
	
	public static byte[] toByteArrs(List<Byte> dataList){
		byte[] ret = new byte[dataList.size()];
		for( int i = 0 ; i < dataList.size(); i ++){
			ret[i] = dataList.get(i);
		}
		
		return ret;
	}
	
	@Test
	public void testBinary() throws IOException {

		Double v = 20.0;
		
		System.out.println(Arrays.toString(double2Bytes(v)));

		LonglyRiceInput in = new LonglyRiceInput();
		in.HG = new double[]{12.3,0.12345678};
		in.WN = 13.0;
		in.EN0 = 172222.0;
		in.GME = 9.0;
		in.ZGND = 1.0;
		in.KLIM = 172.01333;
		in.EPS = 9898989.43;
		in.SGM = 9988.129222;
		
		List<Byte> dataList = new ArrayList<Byte>();
		
		addByteList(dataList, in.HG[0]);
		addByteList(dataList, in.HG[1]);
		addByteList(dataList, in.WN);
		addByteList(dataList, in.EN0);
		addByteList(dataList, in.GME);
		addByteList(dataList, in.ZGND);
		addByteList(dataList, in.KLIM);
		addByteList(dataList, in.EPS);
		addByteList(dataList, in.SGM);
	

		addByteList(dataList, in.KLIM);
		addByteList(dataList, in.EPS);
		addByteList(dataList, in.SGM);
		
		
		ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
		byteOut.write(toByteArrs(dataList));
		FileOutputStream fstream = new FileOutputStream("D:\\workspace\\net\\input", true);
		byteOut.writeTo(fstream);
		fstream.flush();
		fstream.close();
		
		
	}
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值