zoukankan      html  css  js  c++  java
  • java与C、C++进行通信的一些问题

    近几天看到csdn上问c/c++和Java通信的问题比较多,特别是c特有的数据结构(如strUCt)。
    特地根据网友的一个问题举个例子,希望对初学者有所帮助。
    原问题见:http://community.csdn.net/EXPert/topic/3886/3886989.XML?temp=.3527033
    这类问题通常是为了利用原有Server或者Server不能做改(通常是c/c++)造成。
    比如Server端只接收一个结构Employee,定义如下:
    struct UserInfo {
    char UserName[20];
    int UserId;
    };
    struct Employee {
    UserInfo user;
    float salary;
    };
    当然也可以定义为
    struct Employee {
    char name[20];
    int id;
    float salary;
    };
    java client 测试源码(为说明问题,假设struct字节对齐,sizeof(Employee)=28)
    import java.net.*;
    /**
    * 与C语言通信(java做Client,c/c++做Server,传送一个结构)
    * @author kingfish
    * @version 1.0
    */
    class Employee {
    private byte[] buf = new byte[28]; //为说明问题,定死大小,事件中可以灵活处理
    /**
    * 将int转为低字节在前,高字节在后的byte数组
    */
    private static byte[] toLH(int n) {
    byte[] b = new byte[4];
    b[0] = (byte) (n & 0xff);
    b[1] = (byte) (n >> 8 & 0xff);
    b[2] = (byte) (n >> 16 & 0xff);
    b[3] = (byte) (n >> 24 & 0xff);
    return b;
    }
    /**
    * 将float转为低字节在前,高字节在后的byte数组
    */
    private static byte[] toLH(float f) {
    return toLH(Float.floatToRawIntBits(f));
    }
    /**
    * 构造并转换
    */
    public Employee(String name, int id, float salary) {
    byte[] temp = name.getBytes();
    System.arraycopy(temp, 0, buf, 0, temp.length);
    temp = toLH(id);
    System.arraycopy(temp, 0, buf, 20, temp.length);
    temp = toLH(salary);
    System.arraycopy(temp, 0, buf, 24, temp.length);
    }
    /**
    * 返回要发送的数组
    */
    public byte[] getBuf() {
    return buf;

     

    }
    /**
    * 发送测试
    */
    public static void main(String[] args) {
    try {
    Socket sock = new Socket("127.0.0.1", 8888);
    sock.getOutputStream().write(new Employee("kingfish", 123456789, 8888.99f).
    getBuf());
    sock.close();
    }
    catch (Exception e) {
    e.printStackTrace();
    }
    } //end
    ---------------------------------------------------------------------------
    当然,也可以利用writeInt,writeFloat方法发送,但字节顺序需要改为低在前。
    这个问题稍后在讨论。
    如有任何问题,请指正!

     

    正文:

    第一部分请见http://blog.csdn.net/kingfish/archive/2005/03/29/333635.aspx

    本部分提出另外一种做法, 供参考。

    import java.net.*;
    import java.io.*;

    /**
     * 与C语言通信(java做Client,c/c++做Server,传送一个结构)
     * @author kingfish
     * @version 1.0
     */
    public class Employee2 {
      private String name;
      private int id;
      private float salary;

      /**
       * 将int转为低字节在前,高字节在后的int
       */
      private static int toLH(int in) {
        int out = 0;
        out = (in & 0xff) << 24;
        out |= (in & 0xff00) << 8;
        out |= (in & 0xff0000) >> 8;
        out |= (in & 0xff000000) >> 24;
        return out;
      }

      /**
       * 将float转为低字节在前,高字节在后的int
       */
      private static int toLH(float f) {
        return toLH(Float.floatToRawIntBits(f));
      }

      /**
       * 构造并转换
       */
      public Employee2(String name, int id, float salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
      }

      /**
       * 取得名字,定长byte数组
       */
      public byte[] getName() {
        byte[] b = new byte[20];
        System.arraycopy(name.getBytes(), 0, b, 0, name.getBytes().length);
        return b;
      }

      /**
       * 取得编号(低字节在前)
       */
      public int getId() {
        return toLH(id);
      }

      /**
       * 取得工资(低字节在前)
       */
      public int getSalary() {
        return toLH(salary);
      }

      /**
       * 发送测试
       */
      public static void main(String[] args) {
        try {
          Employee2 p = new Employee2("kingfish", 123456789, 8888.99f);

          Socket sock = new Socket("127.0.0.1", 8888);
          DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
          dos.write(p.getName());
          dos.writeInt(p.getId());
          dos.writeInt(p.getSalary());
          sock.close();
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
    } //end

    -----------------------------------------------------------------------------------------------------

    如有任何问题,请指正!

    kingfish
    2005.3.30

  • 相关阅读:
    快速构建一个vue项目的开发环境(基础)
    一个vue的简单例子
    webpack基础使用
    程序日志正常,linux进程异常终止,如何查看日志
    mysql多字段排序
    mysql连表
    go网络
    go通道关闭
    【软考】CMMI的5个等级和22个过程域
    maven工程导入时解决Cannot change version of project facet Dynamic Web Module to 2.3
  • 原文地址:https://www.cnblogs.com/pony/p/804819.html
Copyright © 2011-2022 走看看