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 ...
随机推荐
- BotVS开发基础—2.5 策略交互
一.代码部分 isOpen = False; # 是否 开仓 price = 0; # 全局变量 价格 amount = 0; # 全局变量 下单量 def exec_command(command) ...
- Python爬取糗事百科
import urllib import urllib.request from bs4 import BeautifulSoup """ 1.抓取糗事百科所有纯 ...
- codeforces 466d Increase Sequence
D. Increase Sequence time limit per test 1 second memory limit per test 256 megabytes input standard ...
- vue.js基础知识篇(2):指令详解
第三章:指令 1.语法 指令以v-打头,它的值限定为绑定表达式,它负责的是按照表达式的值应用某些行为到DOM上. 内部指令有v-show,v-else,v-model,v-repeat,v-for,v ...
- 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序
使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...
- Mock Server 入门
Mock Server介绍 什么是mock ? 我在去年的时候介绍一篇幅 python mock的基本使用,http://www.cnblogs.com/fnng/p/5648247.html 主要是 ...
- python爬虫-抓取acg12动漫壁纸排行设置为桌面壁纸
ACG-wallpaper 初学python,之前想抓取P站的一些图片来着,然后发现acg12这里有专门的壁纸榜单,就写了个抓取壁纸作为mac桌面壁纸玩玩. 功能:抓取acg12壁纸榜单的动漫壁纸,并 ...
- poj 2762 强连通缩点+拓扑排序
这题搞了好久,先是拓扑排序这里没想到,一开始自己傻乎乎的跑去找每层出度为1的点,然后才想到能用拓扑排序来弄. 拓扑排序的时候也弄了挺久的,拓扑排序用的也不多. 题意:给一个图求是否从对于任意两个点能从 ...
- 九度OJ 1016 火星A+B AC版
#include <iostream> #include <string.h> #include <sstream> #include <math.h> ...
- 201521123018 《Java程序设计》第6周学习总结
1. 本章学习总结 2. 书面作业 一.clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 用protected修饰 ...