c与java数据传输

来源:互联网 发布:百度云盘mac历史版本 编辑:程序博客网 时间:2024/05/16 09:29

说明


当需要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;}@Testpublic 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
原创粉丝点击