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); } }
作者:rainmote
博客:http://www.cnblogs.com/rainmote
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。