Java与C++类型转换手记

原因:

Java 中所有的数据类型(char除外)全是有符号的,但服务器有些值为 unsigned,

于是通信时问题出现了...

高地位、对齐位、值域、符号位、......

 

工具类:

这些特定的小方法不能通用,得尝试,暂时不想总结,先存着

 

/** * 工具类:自己写的用绿色修饰框,查错时优先考虑 * * @author Lazybone * */ public class SocketTools { /** * byte[] -> 汉字 */ public static String byteToStrCn(byte[] b) { String str = ""; try { str = new String(byteTrim(b), "gb2312"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return str; } /* * byte4 -> boolean */ public boolean byte4ToBoolean(byte[] b) { return (byte4ToInt(b) == 0) ? false : true; } /* * boolean -> byte4 */ public byte[] booleanToByte4(boolean b) { return (b == true) ? intToByte4(1) : new byte[4]; } /* * 无符号int->有符号int */ public static int unSignedIntToInt(int t) { return (t < 0) ? (Integer.MAX_VALUE + t + 2) : t; } /* * 把要转成String的byte[]去0 原方法,从结尾开始判断零 */ public static byte[] byteTrim_old(byte[] b) { int j = b.length; for (int i = j; i > 0; i--) { if (b[i - 1] != 0) { j = i; break; } } byte[] a = new byte[j]; for (int i = 0; i < j; i++) { a[i] = b[i]; } return a; } /** * 把要转成String的byte[],遇零结束 */ public static byte[] byteTrim(byte[] b) { if (b == null) return new byte[0]; int j = b.length; for (int i = 0; i < j; i++) { if (b[i] == 0) { j = i; break; } } byte[] a = new byte[j]; for (int i = 0; i < j; i++) { a[i] = b[i]; } return a; } /** byte[]->long **/ public static long byte8ToLong(byte[] b) { long l = 0; l = b[0]; l |= ((long) b[1] << 8); l |= ((long) b[2] << 16); l |= ((long) b[3] << 24); l |= ((long) b[4] << 32); l |= ((long) b[5] << 40); l |= ((long) b[6] << 48); l |= ((long) b[7] << 56); return l; } /** long -> byte[8]* */ public static byte[] longToByte8(long v) { byte buffer[] = new byte[8]; buffer[0] = (byte) (v >>> 56); buffer[1] = (byte) (v >>> 48); buffer[2] = (byte) (v >>> 40); buffer[3] = (byte) (v >>> 32); buffer[4] = (byte) (v >>> 24); buffer[5] = (byte) (v >>> 16); buffer[6] = (byte) (v >>> 8); buffer[7] = (byte) (v >>> 0); return buffer; } /** * 无符号long-->byte[](Add20100613) * * @param bb * @param x * @param index */ public static byte[] unsignedLongToByteArray(long x, int index) { byte[] bb = new byte[8]; bb[index + 0] = (byte) (x >> 56); bb[index + 1] = (byte) (x >> 48); bb[index + 2] = (byte) (x >> 40); bb[index + 3] = (byte) (x >> 32); bb[index + 4] = (byte) (x >> 24); bb[index + 5] = (byte) (x >> 16); bb[index + 6] = (byte) (x >> 8); bb[index + 7] = (byte) (x >> 0); return bb; } /** * 无符号long-->byte[](反序)(Add20100613) * * @param x * @param index * @return */ public static byte[] unsignedLongToByteArrayByReverse(long x, int index) { byte[] bb = new byte[8]; bb[index + 7] = (byte) (x >> 56); bb[index + 6] = (byte) (x >> 48); bb[index + 5] = (byte) (x >> 40); bb[index + 4] = (byte) (x >> 32); bb[index + 3] = (byte) (x >> 24); bb[index + 2] = (byte) (x >> 16); bb[index + 1] = (byte) (x >> 8); bb[index + 0] = (byte) (x >> 0); return bb; } /** * byte[]-->无符号long(Add20100613) * * @param bb * @param index * @return */ public static long byteArrayTounsignedLong(byte[] bb, int index) { return ((((long) bb[index + 0] & 0xff) << 56) | (((long) bb[index + 1] & 0xff) << 48) | (((long) bb[index + 2] & 0xff) << 40) | (((long) bb[index + 3] & 0xff) << 32) | (((long) bb[index + 4] & 0xff) << 24) | (((long) bb[index + 5] & 0xff) << 16) | (((long) bb[index + 6] & 0xff) << 8) | (((long) bb[index + 7] & 0xff) << 0)); } /** * byte[]-->无符号long反序(Add20100613) * * @param bb * @param index * @return */ public static long byteArrayTounsignedLongByReverse(byte[] bb, int index) { return ((((long) bb[index + 7] & 0xff) << 56) | (((long) bb[index + 6] & 0xff) << 48) | (((long) bb[index + 5] & 0xff) << 40) | (((long) bb[index + 4] & 0xff) << 32) | (((long) bb[index + 3] & 0xff) << 24) | (((long) bb[index + 2] & 0xff) << 16) | (((long) bb[index + 1] & 0xff) << 8) | (((long) bb[index + 0] & 0xff) << 0)); } /** short -> byte[2] **/ public static byte[] shortToByte2(int v) { byte[] b = new byte[2]; b[0] = (byte) ((v >>> 8) & 0xFF); b[1] = (byte) ((v >>> 0) & 0xFF); return b; } /** * int->byte[] */ public static byte[] intToByte4(int i) { byte[] bt = new byte[4]; bt[0] = (byte) (0xff & i); bt[1] = (byte) ((0xff00 & i) >> 8); bt[2] = (byte) ((0xff0000 & i) >> 16); bt[3] = (byte) ((0xff000000 & i) >> 24); return bt; } /** * byte[]转int */ public static int byte4ToInt(byte[] bytes) { int num = bytes[0] & 0xFF; num |= ((bytes[1] << 8) & 0xFF00); num |= ((bytes[2] << 16) & 0xFF0000); num |= ((bytes[3] << 24) & 0xFF000000); return num; } /* * 将有符号int 转为 long,即无符号int */ public static long intToLong(int a) { return a < 0 ? (long) Integer.MAX_VALUE + a - Integer.MIN_VALUE : a; } }  

你可能感兴趣的:(Java与C++类型转换手记)