• 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编码。

  • 相关阅读:
    JavaScript获取http,http://请求协议头,域名,端口,url
    JAVA Pattern正则获取大括号中内容,substring字符串截取获取大括号中内容
    系统时间相关
    简单搭建nfs
    电信电话相关
    windows常用设置
    sort用法
    vim查询替换相关
    vim常用命令 技巧
    编绎vim8.2+deepin v15.11
  • 原文地址:https://www.cnblogs.com/zzy-frisrtblog/p/5826511.html
Copyright © 2020-2023  润新知