这段时间将项目中一个模块参照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);
}
}

Java中的类型转换(Integer、Long、String)的更多相关文章

  1. Java中数据类型转换&基本类型变量和对象型变量

    1.Java的数据类型分为三大类 布尔型,字符型和数值型 其中数值型又分为整型和浮点型 2.Java的变量类型 布尔型 boolean 字符型 char 整型    byte,short,int,lo ...

  2. Java中List、integer[]、int[]之间的转化

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...

  3. c#中的里氏转换和Java中强制类型转换在多态中的应用

    在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父 ...

  4. java中强制类型转换

    在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...

  5. java中的类型转换

    java中的类型转换分为两种 自动类型转换 要实现数据的自动类型转换必须同时满足下面两个条件 两种数据类型彼此兼容 目标类型的取值范围大于原类型范围 强制类型转换 当两种数据类型彼此不兼容,或者说目标 ...

  6. java中int和Integer比较

    java中int和Integer比较 一,类型区别 我们知道java中由两种数据类型,即基本类型和对象类型,int就是基本数据类型,而Integer是一个class,也习惯把Integer叫做int的 ...

  7. Java基础知识强化22:Java中数据类型转换

    数据类型转换: (1). 自动转换 低级变量可以直接转换为高级变量,这叫自动类型转换.比如: byte b: int b:  long b:  float b:   double  b: 上面的语句可 ...

  8. Java中数据类型转换大全(个人总结)

    一.字符串转换为其他类型 1.将字符串转化为int型 (1)方法一 int i = Integer.parseInt(String str); (2)方法二 int i = Integer.value ...

  9. 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接

    长久以来,我们被教导字符串的连接最好用StringBuffer.StringBuilder,但是我们却不知道这两者之间的区别.跟字符串相关的一些方法中总是有CharSequence.StringBuf ...

随机推荐

  1. Android事件传递机制详解及最新源码分析——View篇

    摘要: 版权声明:本文出自汪磊的博客,转载请务必注明出处. 对于安卓事件传递机制相信绝大部分开发者都听说过或者了解过,也是面试中最常问的问题之一.但是真正能从源码角度理解具体事件传递流程的相信并不多, ...

  2. C# 隐藏文件

    void SerializeXmlNodes(XmlSerializer serialize, string filePath, List<XmlNode> nodes) { using ...

  3. Java温故而知新-空心菱形

    空心菱形 今天做题练手,题目是空心菱形,一开始没什么思路,去网上找了找,发现很难找到讲的通透的,自己现在独立做出来了,记录一下,以备后用. * * * * * * * * * * * * * * * ...

  4. linux(十)之初始化文件

    前面写了很多linux的知识,其实很多都是命令的,所以要去多多的练习才能学的更好,加油为了好工作. 要么现在懒惰,未来讨饭.要么现在努力,未来惬意. 一.初始化文件概述 1.1.概述 系统初始化文件是 ...

  5. Jquery Mobile笔记之一

    jQuery Mobile 在你的网页中添加 jQuery Mobile 你可以通过以下几种方式将jQuery Mobile添加到你的网页中: 从 CDN 中加载 jQuery Mobile (推荐) ...

  6. java Io流中FileInputStream和BufferedInputStream的速度比较

    首先是对FileInputStream 加上 FileOutputStream 对文件拷贝的应用 我这里拷贝的是一个视频.当然,你们拷贝什么都可以,当文件越大时效果越明显 下面是对BufferedIn ...

  7. window.onerror 应用实例

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp75   window.onerror = function(sMessa ...

  8. 使用spring框架处理编码问题

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp90   我们在开发时,经常要对中文字符进行处理,进行处理中文字符的方式也 ...

  9. Day-12: 进程和线程

    进程和线程 在操作系统看来,一个任务就是一个进程,而一个进程内部如果要做多个任务就是有多个线程.一个进程至少有一个线程. 真正的并行执行任务是由多个CUP分别执行任务,实际中是由,操作系统轮流让各个任 ...

  10. js中防止全局变量被污染的方法

    (function ($){ var oDiv = $('div1');//获取id为'div1'的页面元素 })(function $(id){ return document.getElement ...