java和c通信相關的數據類型轉換


利用socket進行網絡傳輸的時候往往需要將int轉換為bytes,將string轉換為bytes以及一些其他類型的數據轉換

java和c類型的區別:
變量類型    C中字節數    Java中字節數
char        1             2
byte        無            1
short        2            2
int          4            4
long        4            8

int 和bytes

int-bytes
    1:Integer.toString(int b).getBytes());
    2:
        public static void int2Bytes(int i, byte[] buf, int offset) {
            buf[offset] = (byte) i;
            i >>= 8;
            buf[offset + 1] = (byte) i;
            i >>= 8;
            buf[offset + 2] = (byte) i;
            i >>= 8;
            buf[offset + 3] = (byte) i;
        }
bytes-int
    1:Integer.parseInt((bytes[] b).toString())
    2:
        private static int byte2Int(byte[] bs) {
            int retVal = 0;
            int len = bs.length < 4 ? bs.length : 4;
            for (int i = 0; i < len; i++) {
                retVal |= (bs[i] & 0xFF) << ((i & 0x03) << 3);
            }
            return retVal;
            // 如果確定足4位,可直接返回值
            //return (bs[0]&0xFF) | ((bs[1] & 0xFF)<<8) | ((bs[2] & 0xFF)<<16) | ((bs[3] & 0xFF)<<24);
        }
        

int和String

int-String  int i
    1:Integer.toString(i,xx); //xx為想要用什么進制來表示,缺省為10進制
    2:i+" ";
    3:String.valueOf(i);//和1不同的是他可以轉換的除了對象還可以為基本數據類型比如long boolean double
                        //而且i可以為null但是1的i為null的話就會報錯拋出異常
String-int  String s
    1:Integer.parseInt(s)

 

bytes和String

String-bytes:(String a)
        1:a.getBytes(x);//x為指定的編碼,缺省的話為utf-8
            //同一個字符串調用a.getBytes()兩次並且分別打印,他們的內容會不同,調用一次返回的都是一個新的數組對像, 你打印的是對象引用的哈希碼(不是對像里面的內容),
            //肯定是不一樣的(因為每次返回都是一個新的變量).他們的內容是一樣的.
        2:(byte)a.charAt(i)
bytes-String :bytes[] b
        1:String a=new String(b,x);//x為指定的編碼,缺省的話為utf-8
        2:
            StringBuffer sb=new StringBuffer();
            for(int i=0;i<b.length;i++){
                sb.append((char)b[i]);
            }
            System.out.println(sb.toString());

特別注意編碼問題:  
  1:
  bytebytes[] = new byte[] { 50, 0, -1, 28, -24 };
  String string = new String(bytes);
  byte[] ret = string.getBytes();
  查看ret的數據發現是50, 0, -17, -65, -67, 28, -17, -65, -67,發現數據並不是原來的數據。
  而使用如下代碼就可以得到原來的數據:
  2:
  bytebytes[] = new byte[] { 50, 0, -1, 28, -24 };
  StringisoString = new String(bytes, "ISO-8859-1");
  byte[] isoret = isoString.getBytes("ISO-8859-1");
  第一種方法默認是用UTF-8編碼來生成String的,用System.getProperty("sun.jnu.encoding")可以得到
  Android默認編碼是UTF-8。UTF-8是可變長度的編碼,原來的字節數組就被改變了。而ISO8859-1通常叫做
  Latin-1,Latin-1包括了書寫所有西方歐洲語言不可缺少的附加字符,其中 0~127的字符與ASCII碼相同,
  它是單字節的編碼方式,這樣第二種方式生成的String里的字節數組就跟原來的字節數組一樣。在new String
  使用其他編碼如GBK,GB2312的話一樣也會導致字節數組發生變化,因此要想獲取String里單字節數組,就應該
  使用iso8859-1編碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM