久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

java和C結(jié)構(gòu)體通信

 mrjbydd 2013-07-22

java和C結(jié)構(gòu)體通信

分類: Java 1228人閱讀 評論(1) 收藏 舉報
  1. package com.cvicse.naba.service.impl.user;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import com.cvicse.naba.common.utils.ByteConvert;  
  9. import com.cvicse.naba.common.utils.ObjectUtils;  
  10. import com.cvicse.naba.service.api.msg.IMessageManSrv;  
  11. import com.cvicse.naba.service.api.user.IUserManageSrv;  
  12. import com.cvicse.unicorn.framework.entity.CB_User;  
  13.   
  14. /** 
  15.  *  
  16.  *  
  17.  * 描述: 
  18.  * <p> 
  19.  *     用戶操作數(shù)據(jù)接口實現(xiàn)類,。 
  20.  * </p> 
  21.  * 創(chuàng)建日期:2012-7-9 下午3:39:46<br> 
  22.  *  
  23.  * @author:tianyj<br> 
  24.  * @update:$Date$<br> 
  25.  * @version:$Revision$<br> 
  26.  * @since 1.0.0 
  27.  */  
  28. public class UserManageSrvImpl implements IUserManageSrv {  
  29.   
  30.     private static final int STRUCTS_LENGTH = 316;  
  31.   
  32.     private IMessageManSrv messageManSrv;  
  33.   
  34.     /** 
  35.      * 保存用戶信息到后臺 
  36.      *  
  37.      * @param user 
  38.      *          當前登陸user對象 
  39.      * @param map 
  40.      *          添加的數(shù)據(jù)信息 
  41.      * @return boolean 
  42.      *          成功與否,,true成功,;false失敗 
  43.      * @throws Exception 
  44.      */  
  45.     @Override  
  46.     public String saveUser(CB_User user, Map<String, String> map) throws Exception {  
  47.         // 方法坐標  
  48.         user.setC_x(20);  
  49.         user.setC_y(1);  
  50.         // 保存前臺傳遞的用戶數(shù)據(jù)信息  
  51.         // String userInfo = this.getSaveUserMessage(map);  
  52.         byte[] returnMsg = messageManSrv.exeCommand(user, getSaveUserMessage(map));  
  53.         String result = null;  
  54.         if (returnMsg != null) {  
  55.             if (handleResult(returnMsg)) {  
  56.                 result = "true";  
  57.             } else {  
  58.                 result = "false";  
  59.             }  
  60.         } else {  
  61.             result = "logout";  
  62.         }  
  63.         // 處理后臺返回的操作結(jié)果  
  64.         return result;  
  65.     }  
  66.       
  67.     /** 
  68.      * 更新用戶信息, 
  69.      * 只是調(diào)用后臺的方法不同 通過設置user.setC_X和user.setC_Y方法坐標確定 
  70.      * @param user 
  71.      *            user對象,,主要是方法坐標 
  72.      * @param map 
  73.      *            更新的信息 
  74.      * @return 
  75.      * @throws Exception 
  76.      */  
  77.     @Override  
  78.     public String updateUser(CB_User user, Map<String, String> map) throws Exception {  
  79.         user.setC_x(20);  
  80.         user.setC_y(4);  
  81.         // 更新前臺需要更新的用戶信息  
  82.         // String userInfo = this.getUpdateUserMessage(map);  
  83.         byte[] returnMsg = messageManSrv.exeCommand(user, getUpdateUserMessage(map));  
  84.         String result = null;  
  85.         if (returnMsg != null) {  
  86.             if (handleResult(returnMsg)) {  
  87.                 result = "true";  
  88.             } else {  
  89.                 result = "false";  
  90.             }  
  91.         } else {  
  92.             result = "logout";  
  93.         }  
  94.         // 處理后臺操作返回的結(jié)果  
  95.         return result;  
  96.     }  
  97.       
  98.     /** 
  99.      * 修改用戶登陸密碼,,沒有用到暫時 
  100.      * @param user 
  101.      * @param map 
  102.      * @throws Exception 
  103.      * @return  
  104.      */  
  105.     @Override  
  106.     public boolean updatePassword(CB_User user, Map<String, String> map) throws Exception {  
  107.         // TODO Auto-generated method stub  
  108.         String passInfo = "";  
  109.         byte[] returnMsg = messageManSrv.exeCommand(user, passInfo);  
  110.         // 處理后臺操作返回的結(jié)果  
  111.         return handleResult(returnMsg);  
  112.     }  
  113.       
  114.     /** 
  115.      * 刪除用戶 
  116.      * @parma user 
  117.      *          當前登陸user對象 
  118.      * @param str 
  119.      *          要刪除的user的ID 
  120.      * @throws Exception 
  121.      *           
  122.      * @return boolean  
  123.      *          返回是否刪除成功:true成功;false失敗 
  124.      */  
  125.     @Override  
  126.     public String deleteUser(CB_User user, String str) throws Exception {  
  127.         user.setC_x(20);  
  128.         user.setC_y(3);  
  129.         // 處理返回的信息  
  130.         byte[] returnMsg = messageManSrv.exeCommand(user, str);  
  131.         String result = null;  
  132.         if (returnMsg != null && handleResult(returnMsg)) {  
  133.             if (handleResult(returnMsg)) {  
  134.                 result = "true";  
  135.             } else {  
  136.                 result = "false";  
  137.             }  
  138.         } else {  
  139.             result = "logout";  
  140.         }  
  141.         return result;  
  142.     }  
  143.       
  144.     /** 
  145.      * 獲得單個用戶信息 
  146.      */  
  147.     @Override  
  148.     public Map<String, String> getUserMap(CB_User user, String userID) throws Exception {  
  149.         // 處理后臺傳遞的字符串進行解析  
  150.         Map<String, String> map = null;  
  151.         byte[] returnMsg = messageManSrv.exeCommand(user, "");  
  152.         // 處理字節(jié)轉(zhuǎn)換為CB_User  
  153.         byte[] struct = new byte[returnMsg.length - 7];  
  154.         System.arraycopy(returnMsg, 7, struct, 0, returnMsg.length - 7);  
  155.         map = this.getUserInfoFromByte(struct);  
  156.         return map;  
  157.     }  
  158.   
  159.     /** 
  160.      * 返回的returnMsg格式【4個字節(jié)+1個字節(jié)+2個字節(jié)+結(jié)構(gòu)體列表字節(jié)】 
  161.      * 4個字節(jié)表示傳遞長度但是不包括該4個字節(jié)在內(nèi) 1個字節(jié)表示成功或者失敗 
  162.      * 2個字節(jié)表示調(diào)用后臺的方法坐標 結(jié)構(gòu)體字節(jié):每個結(jié)構(gòu)體都是固定長度,, 
  163.      * 不足補0,,需要把結(jié)構(gòu)體列表 進行解析處理 
  164.      */  
  165.     @Override  
  166.     public List<Map<String, String>> getUserListMap(CB_User user) throws Exception {      
  167.         // 設置調(diào)用后臺的方法坐標  
  168.         user.setC_x(20);  
  169.         user.setC_y(2);  
  170.         // 處理后臺傳遞的用戶信息列表  
  171.         List<Map<String, String>> list = null;  
  172.         // 執(zhí)行后臺程序返回結(jié)果  
  173.         byte[] returnMsg = messageManSrv.exeCommand(user, "");  
  174.         if (returnMsg != null) {  
  175.             // 后臺處理成功,進行解析字符串  
  176.             if (handleResult(returnMsg)) {  
  177.                 // 處理字節(jié)轉(zhuǎn)換為List進行返回,,returnMsg.length-7表示結(jié)構(gòu)體列表長度  
  178.                 byte[] structs = new byte[returnMsg.length - 7];  
  179.                 // 把結(jié)構(gòu)體列表信息字節(jié)復制到另外的字節(jié)數(shù)組,,以便處理  
  180.                 System.arraycopy(returnMsg, 7, structs, 0, returnMsg.length - 7);  
  181.                 // 處理結(jié)構(gòu)體數(shù)組,,返回List<Map>,,Map中存放一個結(jié)構(gòu)體信息  
  182.                 list = this.getUserInfoListFromByte(structs);  
  183.             }  
  184.         } else {  
  185.             // 處理超時登陸  
  186.             list = new ArrayList<Map<String, String>>();  
  187.             Map<String, String> map = new HashMap<String, String>();  
  188.             map.put("logout""logout");  
  189.             list.add(map);  
  190.         }  
  191.           
  192.         return list;  
  193.     }  
  194.       
  195.     /** 
  196.      * 解析后臺操作的結(jié)果 
  197.      *  
  198.      * @param msg 
  199.      * @return 
  200.      */  
  201.     private boolean handleResult(byte[] msg) {  
  202.         boolean flag = false;  
  203.         if (msg.length >= 7) {  
  204.             // 消息【4個字節(jié)+1個字節(jié)+2個字節(jié)+n個字節(jié)】  
  205.             int result = msg[4];  
  206.             if (0 == result) {  
  207.                 flag = true;  
  208.             }  
  209.         }  
  210.         return flag;  
  211.     }  
  212.   
  213.     /** 
  214.      * 依賴注入IMessageManSrv 
  215.      *  
  216.      * @param messageManSrv 
  217.      */  
  218.     public void setMesageManSrv(IMessageManSrv messageManSrv) {  
  219.         this.messageManSrv = messageManSrv;  
  220.     }  
  221.   
  222.     /** 
  223.      * 釋放注入的IMessageManSrv 
  224.      *  
  225.      * @param messageManSrv 
  226.      */  
  227.     public void unSetMessageManSrv(IMessageManSrv messageManSrv) {  
  228.         this.messageManSrv = null;  
  229.     }  
  230.   
  231.     /** 
  232.      * 封裝后臺結(jié)構(gòu)體,傳遞給后臺進行存儲操作  
  233.      * typedef struct {  
  234.      *  unsigned char cmdtype;  
  235.      *  unsigned char subcmd;  
  236.      *  unsigned char operate; //1.add, 2.change添加,、修改  
  237.      *  unsigned char passflag;//是否采用USB-KEY方式登錄  
  238.      *  unsigned char priority;  
  239.      *  unsigned char state;---//狀態(tài),,禁用與否  
  240.      *  空兩個字節(jié) 
  241.      *  int permission;  
  242.      *  int authtype;  
  243.      *  unsigned char userid[16];//用戶ID  
  244.      *  unsigned char username[16];//用戶名 
  245.      *  unsigned char passfirst[16];//密碼  
  246.      *  unsigned char passsecond[16];  
  247.      *  unsigned char emailaddr[64];//郵箱  
  248.      *  unsigned char dept[32];//部門 
  249.      *  unsigned char mobile[16];//電話 
  250.      *  unsigned char role[16];//角色  
  251.      *  unsigned char memo[128];//描述  
  252.      * } PKT_USER_REQ; 
  253.      *  
  254.      * @param map 
  255.      * @return 
  256.      */  
  257.     private byte[] getSaveUserMessage(Map<String, String> map) {  
  258.         /*StringBuffer msg = new StringBuffer();*/  
  259.         byte[] msgByte = new byte[336];  
  260.           
  261.         byte[] preSixMsg = new byte[6];  
  262.         preSixMsg[0] = 0;// cmdtype  
  263.         preSixMsg[1] = 0;// subcmd  
  264.         preSixMsg[2] = 1;// operate 1.add, 2.change添加、修改  
  265.         // passflag是否采用USB-KEY方式登錄  
  266.         preSixMsg[3] = Byte.parseByte(ObjectUtils.toString(map.get("isUkey")));  
  267.         preSixMsg[4] = 0;// priority  
  268.   
  269.         // state狀態(tài),,禁用與否  
  270.         preSixMsg[5] = Byte.parseByte(ObjectUtils.toString(map.get("state")));  
  271.         System.arraycopy(preSixMsg, 0, msgByte, 0, preSixMsg.length);  
  272.           
  273.         // 補零操作  
  274.         byte[] completeZero = {0,0};  
  275.         System.arraycopy(completeZero, 0, msgByte, 6, completeZero.length);  
  276.           
  277.         byte[] permissionByte = ByteConvert.intToLBytes(  
  278.                 Integer.parseInt(ObjectUtils.toString(map.get("permission"))));//{0, 0, 0, 0};  
  279.         System.arraycopy(permissionByte, 0, msgByte, 8, permissionByte.length);  
  280.           
  281.         // permissionByte[0] = Byte.parseByte(ObjectUtils.toString(map.get("permission")),2);  
  282.         byte[] authtypeByte = {0000};  
  283.         System.arraycopy(authtypeByte, 0, msgByte, 12, authtypeByte.length);  
  284.           
  285.         // 用戶ID構(gòu)造字節(jié)數(shù)組,,不足16個字節(jié)補0  
  286.         byte[] userid = new byte[16];  
  287.         userid = buildByteArray(ObjectUtils.toString(map.get("userId")).getBytes(), userid);  
  288.         System.arraycopy(userid, 0, msgByte, 16, userid.length);  
  289.           
  290.         // 用戶名字節(jié)數(shù)組,不足16個字節(jié)補0  
  291.         byte[] username = new byte[16];  
  292.         username = buildByteArray(ObjectUtils.toString(map.get("userName")).getBytes(), username);  
  293.         System.arraycopy(username, 0, msgByte, 32, username.length);  
  294.   
  295.         // 密碼字節(jié)數(shù)組,,不足16個字節(jié)補0  
  296.         byte[] passfirst = new byte[16];  
  297.         passfirst = buildByteArray(ObjectUtils.toString(map.get("password")).getBytes(), passfirst);  
  298.         System.arraycopy(passfirst, 0, msgByte, 48, passfirst.length);  
  299.           
  300.         // 二次密碼  
  301.         byte[] passsecond = new byte[16];  
  302.         passsecond = buildByteArray(ByteConvert.intToBytes(0), passsecond);  
  303.         System.arraycopy(passsecond, 0, msgByte, 64, passsecond.length);  
  304.   
  305.         // 郵箱字節(jié)數(shù)組,,不足64個字節(jié)補0  
  306.         byte[] emailaddr = new byte[64];  
  307.         emailaddr = buildByteArray(ObjectUtils.toString(map.get("email")).getBytes(), emailaddr);  
  308.         System.arraycopy(emailaddr, 0, msgByte, 80, emailaddr.length);  
  309.           
  310.         // 部門字節(jié)數(shù)組,不足32個字節(jié)補0  
  311.         byte[] dept = new byte[32];  
  312.         dept = buildByteArray(ObjectUtils.toString(map.get("dept")).getBytes(), dept);  
  313.         System.arraycopy(dept, 0, msgByte, 144, dept.length);  
  314.           
  315.         // 電話  
  316.         byte[] mobile = new byte[16];  
  317.         mobile = buildByteArray(ObjectUtils.toString(map.get("mobile")).getBytes(), mobile);  
  318.         System.arraycopy(mobile, 0, msgByte, 176, mobile.length);  
  319.           
  320.         // 角色  
  321.         byte[] role = new byte[16];  
  322.         role = buildByteArray(ObjectUtils.toString(map.get("role")).getBytes(), role);  
  323.         System.arraycopy(role, 0, msgByte, 192, role.length);  
  324.           
  325.         // 描述  
  326.         byte[] memo = new byte[128];  
  327.         memo = buildByteArray(ObjectUtils.toString(map.get("memo")).getBytes(), memo);  
  328.         System.arraycopy(memo, 0, msgByte, 208, memo.length);  
  329.         /*msg.append(ChangeCharSet.toUTF8(preSixMsg)) 
  330.             .append(ChangeCharSet.toUTF8(completeZero)) 
  331.             .append(ChangeCharSet.toUTF8(permissionByte)) 
  332.             .append(ChangeCharSet.toUTF8(authtypeByte)) 
  333.             .append(ChangeCharSet.toUTF8(userid)) 
  334.             .append(ChangeCharSet.toUTF8(username)) 
  335.             .append(ChangeCharSet.toUTF8(passfirst)) 
  336.             .append(ChangeCharSet.toUTF8(passsecond)) 
  337.             .append(ChangeCharSet.toUTF8(emailaddr)) 
  338.             .append(ChangeCharSet.toUTF8(dept)) 
  339.             .append(ChangeCharSet.toUTF8(mobile)) 
  340.             .append(ChangeCharSet.toUTF8(role)) 
  341.             .append(ChangeCharSet.toUTF8(memo));*/  
  342.   
  343.         return msgByte;  
  344.     }  
  345.   
  346.     /** 
  347.      * typedef struct { 
  348.      *  unsigned char cmdtype; 
  349.      *  unsigned char subcmd; 
  350.      *  unsigned char userid[USER_NAME_SIZE]; 
  351.      *  unsigned char chpass; //0:不修改  1:修改 
  352.      *  unsigned char oldpass[USER_PASS_SIZE]; 
  353.      *  unsigned char newpass[USER_PASS_SIZE]; 
  354.      *  unsigned char passflag; 
  355.      *  unsigned char priority; 
  356.      *  unsigned char state; 
  357.      *  int permission; 
  358.      *  int authtype; 
  359.      *  unsigned char username[USER_NAME_SIZE]; 
  360.      *  unsigned char passfirst[USER_PASS_SIZE]; 
  361.      *  unsigned char passsecond[USER_PASS_SIZE]; 
  362.      *  unsigned char emailaddr[USER_MAIL_SIZE]; 
  363.      *  unsigned char dept[32]; 
  364.      *  unsigned char mobile[USER_TLE_SIZE]; 
  365.      *  unsigned char role[USER_ROLE_SIZE]; 
  366.      *  unsigned char memo[USER_MEMO_LEN]; 
  367.      * } PKT_EDIT_USER_REQ ; 
  368.      *  
  369.      * @param map 
  370.      * @return 
  371.      */  
  372.     private byte[] getUpdateUserMessage(Map<String, String> map){  
  373.         // StringBuffer msg = new StringBuffer();  
  374.         byte[] msgByte = new byte[368];  
  375.           
  376.         byte[] preTwo = new byte[2];  
  377.         preTwo[0] = 0;  
  378.         preTwo[1] = 0;  
  379.         System.arraycopy(preTwo, 0, msgByte, 0, preTwo.length);  
  380.           
  381.         // 用戶ID構(gòu)造字節(jié)數(shù)組,,不足16個字節(jié)補0  
  382.         byte[] userid = new byte[16];  
  383.         userid = buildByteArray(ObjectUtils.toString(map.get("userId")).getBytes(), userid);  
  384.         System.arraycopy(userid, 0, msgByte, 2, userid.length);  
  385.           
  386.         // 是否修改密碼  
  387.         byte[] chpass = new byte[1];  
  388.         chpass[0] = Byte.parseByte(ObjectUtils.toString(map.get("chpass")));  
  389.         System.arraycopy(chpass, 0, msgByte, 18, chpass.length);  
  390.           
  391.         // 舊密碼  
  392.         byte[] oldPass = new byte[16];  
  393.         // 新密碼  
  394.         byte[] newPass = new byte[16];  
  395.         // 修改密碼為1  
  396.         if ("1".equals(ObjectUtils.toString(map.get("chpass")))) {  
  397.             oldPass = buildByteArray(ObjectUtils.toString(map.get("oldPass")).getBytes(), oldPass);  
  398.             newPass = buildByteArray(ObjectUtils.toString(map.get("newPass")).getBytes(), newPass);  
  399.         }   
  400.         System.arraycopy(oldPass, 0, msgByte, 19, oldPass.length);  
  401.         System.arraycopy(newPass, 0, msgByte, 35, newPass.length);  
  402.           
  403.         // 是否使用ukey  
  404.         byte[] passflag = new byte[1];  
  405.         passflag[0] = Byte.parseByte(ObjectUtils.toString(map.get("isUkey")));  
  406.         System.arraycopy(passflag, 0, msgByte, 51, passflag.length);  
  407.           
  408.         // priority,無用  
  409.         byte[] priority = {0};  
  410.         System.arraycopy(priority, 0, msgByte, 52, priority.length);  
  411.           
  412.         // 用戶狀態(tài),,是否被禁用  
  413.         byte[] state = new byte[1];  
  414.         state[0] = Byte.parseByte(ObjectUtils.toString(map.get("state")));  
  415.         System.arraycopy(state, 0, msgByte, 53, state.length);  
  416.           
  417.         // 補零  
  418.         byte[] completeZero = {00};  
  419.         System.arraycopy(completeZero, 0, msgByte, 54, completeZero.length);  
  420.           
  421.         // 無用  
  422.         byte[] permissionByte = ByteConvert.intToLBytes(  
  423.                 Integer.parseInt(ObjectUtils.toString(map.get("permission"))));  
  424.         System.arraycopy(permissionByte, 0, msgByte, 56, permissionByte.length);  
  425.           
  426.         byte[] authtypeByte = {0000};  
  427.         System.arraycopy(authtypeByte, 0, msgByte, 60, authtypeByte.length);  
  428.           
  429.         // 用戶名字節(jié)數(shù)組,,不足16個字節(jié)補0  
  430.         byte[] username = new byte[16];  
  431.         username = buildByteArray(ObjectUtils.toString(map.get("userName")).getBytes(), username);  
  432.         System.arraycopy(username, 0, msgByte, 64, username.length);  
  433.           
  434.         // 密碼字節(jié)數(shù)組,不足16個字節(jié)補0,,不用  
  435.         byte[] passfirst = new byte[16];  
  436.         passfirst = buildByteArray(ByteConvert.intToBytes(0), passfirst);  
  437.         System.arraycopy(passfirst, 0, msgByte, 80, passfirst.length);  
  438.           
  439.         // 二次密碼,,不用  
  440.         byte[] passsecond = new byte[16];  
  441.         passsecond = buildByteArray(ByteConvert.intToBytes(0), passsecond);  
  442.         System.arraycopy(passsecond, 0, msgByte, 96, passsecond.length);  
  443.           
  444.         // 郵箱字節(jié)數(shù)組,不足64個字節(jié)補0  
  445.         byte[] emailaddr = new byte[64];  
  446.         emailaddr = buildByteArray(ObjectUtils.toString(map.get("email")).getBytes(), emailaddr);  
  447.         System.arraycopy(emailaddr, 0, msgByte, 112, emailaddr.length);  
  448.           
  449.         // 部門字節(jié)數(shù)組,,不足32個字節(jié)補0  
  450.         byte[] dept = new byte[32];  
  451.         dept = buildByteArray(ObjectUtils.toString(map.get("dept")).getBytes(), dept);  
  452.         System.arraycopy(dept, 0, msgByte, 176, dept.length);  
  453.           
  454.         // 電話  
  455.         byte[] mobile = new byte[16];  
  456.         mobile = buildByteArray(ObjectUtils.toString(map.get("mobile")).getBytes(), mobile);  
  457.         System.arraycopy(mobile, 0, msgByte, 208, mobile.length);  
  458.           
  459.         // 角色  
  460.         byte[] role = new byte[16];  
  461.         role = buildByteArray(ObjectUtils.toString(map.get("role")).getBytes(), role);  
  462.         System.arraycopy(role, 0, msgByte, 224, role.length);  
  463.           
  464.         // 描述  
  465.         byte[] memo = new byte[128];  
  466.         memo = buildByteArray(ObjectUtils.toString(map.get("memo")).getBytes(), memo);  
  467.         System.arraycopy(memo, 0, msgByte, 240, memo.length);  
  468.           
  469.         /*msg//.append(ChangeCharSet.toUTF8(preTwo)) 
  470.             .append(ChangeCharSet.toUTF8(userid)) 
  471.             .append(ChangeCharSet.toUTF8(chpass)) 
  472.             .append(ChangeCharSet.toUTF8(oldPass)) 
  473.             .append(ChangeCharSet.toUTF8(newPass)) 
  474.             .append(ChangeCharSet.toUTF8(passflag)) 
  475.             .append(ChangeCharSet.toUTF8(priority)) 
  476.             .append(ChangeCharSet.toUTF8(state)) 
  477.             .append(ChangeCharSet.toUTF8(completeZero)) 
  478.             .append(ChangeCharSet.toUTF8(permissionByte)) 
  479.             .append(ChangeCharSet.toUTF8(authtypeByte)) 
  480.             .append(ChangeCharSet.toUTF8(username)) 
  481.             .append(ChangeCharSet.toUTF8(passfirst)) 
  482.             .append(ChangeCharSet.toUTF8(passsecond)) 
  483.             .append(ChangeCharSet.toUTF8(emailaddr)) 
  484.             .append(ChangeCharSet.toUTF8(dept)) 
  485.             .append(ChangeCharSet.toUTF8(mobile)) 
  486.             .append(ChangeCharSet.toUTF8(role)) 
  487.             .append(ChangeCharSet.toUTF8(memo));*/  
  488.       
  489.         return msgByte;  
  490.     }  
  491.       
  492.     /** 
  493.      * 拷貝字節(jié)數(shù)組,,不足長度補0,0的編碼為48,; 
  494.      *  
  495.      * @param srcArry 
  496.      * @param destArry 
  497.      * @param length 
  498.      * @return 
  499.      */  
  500.     private byte[] buildByteArray(byte[] srcArry, byte[] destArry) {  
  501.         int length = srcArry.length;  
  502.         if (srcArry.length > destArry.length) {  
  503.             length = destArry.length;  
  504.         }  
  505.         System.arraycopy(srcArry, 0, destArry, 0, length);  
  506.         return destArry;  
  507.     }  
  508.   
  509.     /** 
  510.      * 處理后臺傳遞過來的多個結(jié)構(gòu)體的方法,,固定一個結(jié)構(gòu)體的長度為313個字節(jié) 把結(jié)構(gòu)體數(shù)組字節(jié)分割成單個結(jié)構(gòu)體數(shù)組,然后進行對每個結(jié)構(gòu)體數(shù)組進行 
  511.      * 解析,,存放到Map中,,Map中對應的是一個結(jié)構(gòu)體,也就是用戶信息 
  512.      *  
  513.      * @param structs 
  514.      *            結(jié)構(gòu)體列表字節(jié)數(shù)組 
  515.      * @return 
  516.      */  
  517.     private List<Map<String, String>> getUserInfoListFromByte(byte[] structs) throws Exception {  
  518.         List<Map<String, String>> list = new ArrayList<Map<String, String>>();  
  519.         // 把結(jié)構(gòu)體字節(jié)數(shù)組進行分割成多個結(jié)構(gòu)體  
  520.         for (int i = 0; i < structs.length / STRUCTS_LENGTH; i++) {  
  521.             // 復制到新的byte數(shù)組  
  522.             byte[] struct = new byte[STRUCTS_LENGTH];  
  523.             // 在原數(shù)組復制操作的起始位置  
  524.             int srcPosition = i * STRUCTS_LENGTH;  
  525.             System.arraycopy(structs, srcPosition, struct, 0, STRUCTS_LENGTH);  
  526.             // 解析單個結(jié)構(gòu)體  
  527.             Map<String, String> temp = getUserInfoFromByte(struct);  
  528.             list.add(temp);  
  529.         }  
  530.         return list;  
  531.     }  
  532.   
  533.     /** 
  534.      * 請求返回的用戶列表結(jié)構(gòu)體定義  
  535.      * typedef struct {  
  536.      * 0 unsigned char passflag; // 是否啟用UKey 
  537.      * 1 unsigned char priority;  
  538.      * 2 unsigned char state;  
  539.      * 3 unsigned char reserve;  
  540.      * 4 unsigned char authtype;  
  541.      * 5 unsigned char userid[16];  
  542.      * 21 unsigned char username[16];  
  543.      * 37 unsigned char emailaddr[64];  
  544.      * 101 unsigned char dept[32];  
  545.      * 133 unsigned char mobile[16]; 
  546.      * 149 unsigned char role[16];  
  547.      * 168 int permission;  
  548.      * 172 unsigned int createtime; 
  549.      * 176 unsigned int lasttime;  
  550.      * 180 int logintimes;  
  551.      * 184 int failtimes; 181 unsigned 
  552.      * 188 char memo[128]; 185 } PKT_USER_LIST; 
  553.      *  
  554.      * @param struct 
  555.      * @return 
  556.      * @throws Exception 
  557.      */  
  558.     private Map<String, String> getUserInfoFromByte(byte[] struct) throws Exception {  
  559.         Map<String, String> map = new HashMap<String, String>();  
  560.         map.put("isUkey", String.valueOf(struct[0]));  
  561.         map.put("state", String.valueOf(struct[2]));  
  562.         map.put("userId", getFieldValue(struct, 516"string"));  
  563.         map.put("userName", getFieldValue(struct, 2116"string"));  
  564.         map.put("email", getFieldValue(struct, 3764"string"));  
  565.         map.put("dept", getFieldValue(struct, 10132"string"));  
  566.         map.put("mobile", getFieldValue(struct, 13316"string"));  
  567.         map.put("role", getFieldValue(struct, 14916"string"));  
  568.         map.put("permission", getFieldValue(struct, 1684"integer"));  
  569.         map.put("createtime", getFieldValue(struct, 1724"time"));  
  570.         map.put("lasttime", getFieldValue(struct, 1764"time"));  
  571.         map.put("logintimes", getFieldValue(struct, 1804"integer"));  
  572.         map.put("failtimes", getFieldValue(struct, 1844"integer"));  
  573.         map.put("memo", getFieldValue(struct, 188128"string"));  
  574.         return map;  
  575.     }  
  576.   
  577.     /** 
  578.      * 處理結(jié)構(gòu)體中單個數(shù)據(jù),, 從給定的字節(jié)數(shù)組中取出特定位置的字節(jié)轉(zhuǎn)換為字符串 
  579.      *  
  580.      * @param bty 
  581.      * @param srcPosition 
  582.      * @param length 
  583.      * @return 
  584.      */  
  585.     private String getFieldValue(byte[] bty, int srcPosition, int length, String converFlag) throws Exception {  
  586.         // 拷貝規(guī)定的字節(jié)長度  
  587.         byte[] temp = new byte[length];  
  588.         String returnStr = "";  
  589.         System.arraycopy(bty, srcPosition, temp, 0, length);  
  590.         if ("".equals(converFlag) || "string".equals(converFlag)) {  
  591.             // 記錄有效字節(jié)的長度  
  592.             int position = 0;  
  593.             /* 
  594.              * 字節(jié)數(shù)組從后面截取,,到第一個不為0停止,記錄位置,,0-position為有效字節(jié) 
  595.              * 例子:[12,52,89,0,0,0,0],,有效字節(jié)為前面的非0字節(jié) 
  596.              */  
  597.             for (int i = temp.length - 1; i >= 0; i--) {  
  598.                 position = i;  
  599.                 if (temp[i] != 0) {  
  600.                     break;  
  601.                 }  
  602.             }  
  603.             // 把有效字節(jié)轉(zhuǎn)為為字符串  
  604.             byte[] validValue = new byte[position + 1];  
  605.             System.arraycopy(temp, 0, validValue, 0, position + 1);  
  606.             returnStr = new String(validValue);  
  607.         } else if ("time".equals(converFlag)) {  
  608.             long time = ByteConvert.lBytesToInt(temp);  
  609.             returnStr = ObjectUtils.get24Time(time*1000);  
  610.             /*Date date = new Date(time*1000); 
  611.             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
  612.             returnStr = sdf.format(date);*/  
  613.         } else if ("integer".equals(converFlag)) {  
  614.             returnStr = String.valueOf(ByteConvert.lBytesToInt(temp));  
  615.         }  
  616.           
  617.         return returnStr;  
  618.     }  
  619.   
  620. }  


 


PS:

1、C中int類型的數(shù)據(jù)在內(nèi)存中存放和int類型占用的字節(jié)數(shù)有關,,因此有些地方需要補零操作,。例如,C在系統(tǒng)中占用4個字節(jié),,int類型的數(shù)據(jù) 在內(nèi)存中存放開始字節(jié)是被4整除的地址,,通過socket傳遞過來的字節(jié)數(shù)組在相應的位置會進行補零(C端進行操作),在Java中解析字節(jié)時或者構(gòu)造相 應的結(jié)構(gòu)體字節(jié)數(shù)組時都要對補零的地方進行操作,,去掉補充的零占位字節(jié)或者添加相應的補零操作,,然后進行傳遞。

2,、在C中的字符串會有結(jié)束標識"\0",,從Java端傳遞的數(shù)據(jù)不要占滿整個字節(jié)數(shù)組,例如:unsigned char emailaddr[64],,java字節(jié)數(shù)組如果填充滿了該字符數(shù)組,,C進行構(gòu)造該字節(jié)數(shù)組時會舍去一部分,會造成亂碼,。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多