• Java中的类型转换(Integer、Long、String)


    这段时间将项目中一个模块参照C++源代码,实现一个JAVA版。主要功能是将一些字段信息转换为String类型,传输后可以进行解析。

    Integer、Long转为String,Java本身提供了这种转换方法。

    Example:

    int a = 127;
    String s = new String(a);
    System.out.println(s);
    //输出 127

    而我的项目需求是Integer、Long字段在String类型中所占大小为固定自己。比如Integer类型的127在内存中应该为0x7f,0x00,0x00,0x00(Little Endian),在String类型输出可能为乱码,但需要在解析后可以还原为Integer类型的127。

    C++中存在无符号数,而JAVA中没有无符号数。所以以byte[]替代unsigned char[]会出现小问题。见下:

    	int n = 0xff7f0012;
    	byte[] b = new byte[4];
    	b[3] = (byte) (n & 0xff);
    	b[2] = (byte) (n >> 8 & 0xff);
    	b[1] = (byte) (n >> 16 & 0xff);
    	b[0] = (byte) (n >> 24 & 0xff);
    	String s = new String(b);
    	for (byte i : b) {
    		System.out.printf("%02x  ", i);
    	}
    	System.out.println();
    	System.out.println(s.length());
    	for (byte i : s.getBytes()) {
    		System.out.printf("%02x  ", i);
    	}
    //输出如下
    ff  7f  00  12  
    3
    3f  00  12  

    由上可见,byte[]转换String类型时,会发生问题,应为byte表示的范围是-128~127,当byte[]中元素大于127时,会被转换成63。尝试使用不同的编码方案解决。

    测试发现UTF-8,GBK,US-ASCII均未得到正确结果。尝试charset为8859_1得到正确结果。

    将上面程序中的String s = new String(b);替换为下面程序段:

    String s = "";
    try {
        s = new String(b, "8859_1");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }    

    即可得到正确结果,下面是程序功能的简单封装。

    public class Test{
    
    	private static byte[] intToByte(int n) {
    		byte[] b = new byte[4];
    		b[3] = (byte) (n & 0xff);
    		b[2] = (byte) (n >> 8 & 0xff);
    		b[1] = (byte) (n >> 16 & 0xff);
    		b[0] = (byte) (n >> 24 & 0xff);
    		return b;
    	}
    	
    	private static byte[] longToByte(long n) {
    		byte[] b = new byte[8];
    		b[7] = (byte) (n & 0xff);
    		b[6] = (byte) (n >> 8 & 0xff);
    		b[5] = (byte) (n >> 16 & 0xff);
    		b[4] = (byte) (n >> 24 & 0xff);
    		b[3] = (byte) (n >> 32 & 0xff);
    		b[2] = (byte) (n >> 40 & 0xff);
    		b[1] = (byte) (n >> 48 & 0xff);
    		b[0] = (byte) (n >> 56 & 0xff);
    		return b;
    	}
    	
    	private static int byteToInt(byte[] b, int beginPos) {
    		return b[beginPos + 3] & 0xff |
    				(b[beginPos + 2] & 0xff) << 8 |
    				(b[beginPos + 1] & 0xff) << 16 |
    				(b[beginPos] & 0xff) << 24;
    	}
    	
    	private static int byteToLong(byte[] b, int beginPos) {
    		return b[beginPos + 7] & 0xff |
    				(b[beginPos + 6] & 0xff) << 8 |
    				(b[beginPos + 5] & 0xff) << 16 |
    				(b[beginPos + 4] & 0xff) << 24 |
    				(b[beginPos + 3] & 0xff) << 32 |
    				(b[beginPos + 2] & 0xff) << 40 |
    				(b[beginPos + 1] & 0xff) << 48 |
    				(b[beginPos] & 0xff) << 56;
    	}
    	
    	private static String intToString(int n) {
    		byte[] b = intToByte(n);
    		String s = "";
    		try {
    			s = new String(b, "8859_1");
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		}
    		
    		return new String(s);
    	}
    	
    	private static String longToString(long n) {
    		byte[] b = longToByte(n);
    		String s = "";
    		try {
    			s = new String(b, "8859_1");
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		}
    		
    		return new String(s);
    	}
    	
    	private static int stringToInt(String str) {
    		byte[] b = new byte[4];
    		try {
    			b = str.getBytes("8859_1");
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		}
    		return byteToInt(b, 0);
    	}
    	
    	private static int stringToLong(String str) {
    		byte[] b = new byte[8];
    		try {
    			b = str.getBytes("8859_1");
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		}
    		return byteToLong(b, 0);
    	}
    }
  • 相关阅读:
    JSON基本操作
    常用的windowd属性和对象
    手动建立数据库连接的BaseDAO
    注意1:图像插值理论的理解
    Python的Scikit-learn如何选择合适的机器学习算法?
    spark-sklearn(spark扩展scikitlearn)
    Tips-Windows 10【多桌面视窗】操作
    jupyter notebook快捷键速查手册
    使用IntelliJ IDEA进行Python远程调试的需求(未完)
    Bazel构建工具的安装
  • 原文地址:https://www.cnblogs.com/rainmote/p/4160555.html
Copyright © 2020-2023  润新知