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);
}
}
Java中的类型转换(Integer、Long、String)的更多相关文章
- Java中数据类型转换&基本类型变量和对象型变量
1.Java的数据类型分为三大类 布尔型,字符型和数值型 其中数值型又分为整型和浮点型 2.Java的变量类型 布尔型 boolean 字符型 char 整型 byte,short,int,lo ...
- Java中List、integer[]、int[]之间的转化
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.functio ...
- c#中的里氏转换和Java中强制类型转换在多态中的应用
在c#中: 注意: 子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数. 如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员.但是父 ...
- java中强制类型转换
在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...
- java中的类型转换
java中的类型转换分为两种 自动类型转换 要实现数据的自动类型转换必须同时满足下面两个条件 两种数据类型彼此兼容 目标类型的取值范围大于原类型范围 强制类型转换 当两种数据类型彼此不兼容,或者说目标 ...
- java中int和Integer比较
java中int和Integer比较 一,类型区别 我们知道java中由两种数据类型,即基本类型和对象类型,int就是基本数据类型,而Integer是一个class,也习惯把Integer叫做int的 ...
- Java基础知识强化22:Java中数据类型转换
数据类型转换: (1). 自动转换 低级变量可以直接转换为高级变量,这叫自动类型转换.比如: byte b: int b: long b: float b: double b: 上面的语句可 ...
- Java中数据类型转换大全(个人总结)
一.字符串转换为其他类型 1.将字符串转化为int型 (1)方法一 int i = Integer.parseInt(String str); (2)方法二 int i = Integer.value ...
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
长久以来,我们被教导字符串的连接最好用StringBuffer.StringBuilder,但是我们却不知道这两者之间的区别.跟字符串相关的一些方法中总是有CharSequence.StringBuf ...
随机推荐
- Quartz总结
前言 最近项目中有使用到Quartz,得空便总结总结,顺便记录一下这种设计模式,毕竟"好记性不如烂笔头". 搭建 pom文件: <dependency> <gro ...
- 说说我和QQ和她的故事
这篇文章纯属感慨而写, 没有教学性质,额我是Jyang 2780217151是我现在用的QQ,然而这并不是我要说的 大概在11年还是12年的时候,我玩这些所谓的黑客圈子,以前的网名我就不说了. 我记得 ...
- HTTP协议的8种请求类型介绍
HTTP协议的8种请求类型介绍 转自:http://www.cnblogs.com/liangxiaofeng/p/5798607.html HTTP协议的8种请求类型介绍 HTTP协议中共定义了八种 ...
- python 之 计数器(counter)
Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能 c = Counter('abcdeabcdabcaba') print c 输出:Counter( ...
- 常用Dos操作指令
1 dir 无参数:查看当前所在目录的文件和文件夹. /s:查看当前目录已经其所有子目录的文件和文件夹. /a:查看包括隐含文件的所有文件. /ah:只显示出隐含文件. /w:以紧凑方式(一行显示5个 ...
- C#格式符
在输出字符串时,使用格式说明 使字符串显示适当的格式,比如:货币格式,或者科学计数法.百分比等. 以下是格式化的数字字符串 格式. {index, alignment: format} 例如: ; ...
- c语言中的文件格式化读写函数fscanf和fprintf函数
很多时候我们需要写入数据到文件中时都觉得很困扰,因为格式乱七八槽的,可读性太差了,于是我们就想有没有什么函数可以格式化的从文件中输入和输出呢,还真有.下面我将讲解一下fscanf和fprintf的强大 ...
- Mybatis 之级联查询 一对多配置
Mybatis级联 查询相对于hibenate是有点麻烦,但是相应好处也是有的,Mybatis轻量.根据自己要的字段配置方便 一对多配置用 <collection property=&quo ...
- indexOf和lastIndexOf方法
lastIndexOf 方法: 返回 String 对象中子字符串最后出现的位置. strObj.lastIndexOf(substring[startindex]) 参数:strObj必选项.Str ...
- System.Globalization.CultureInfo.InvariantCulture 解决不同地域字符串格式不同问题
同样的DateTime.ToShortDateString() 在不同的地域输出格式不同 如在美国的 日期格式为 : 月-日-年 如在中国的 日期格式为 : 年-月-日 一些时候,这个格式就会 ...