关于 java中long类型数据转换为byte[]数组排序,不能正确排序问题,目前的解决方案为:
long 转为 byte[] 时,对 byte[] 中的每一个byte 做一次 减去 128 的操作:如long2Orderbyte 中的实现方式;
byte[]转为 long 时 ,需要对byte[] 中的每一位 做一次 加 128 的操作: 如orderByte2long 中的实现方式;
经过测试,数据经过2次往返转换,数据值不变,且byte[]可以正确的排序。
public static byte[] long2Orderbyte(long n)
{
byte[] b = new byte[8];
b[0] = (byte) ((byte) (n >> 56) - 128);
b[1] = (byte) ((byte) (n >> 48) - 128);
b[2] = (byte) ((byte) (n >> 40) - 128);
b[3] = (byte) ((byte) (n >> 32) - 128);
b[4] = (byte) ((byte) (n >> 24) - 128);
b[5] = (byte) ((byte) (n >> 16) - 128);
b[6] = (byte) ((byte) (n >> 8) - 128);
b[7] = (byte) ((byte) (n >> 0) - 128);
return b;
}
public static long orderByte2long(byte[] b, int offset) throws IllegalArgumentException
{
if (b == null || offset < 0 || b.length < offset + 8) {
log.warn("target or startIndex error");
throw new IllegalArgumentException("target or startIndex error");
}
return ((((long) (b[offset] + 128) & 0xff) << 56) | (((long) (b[offset + 1] + 128) & 0xff) << 48) | (((long) (b[offset + 2] + 128) & 0xff) << 40)
| (((long) (b[offset + 3] + 128) & 0xff) << 32) | (((long) (b[offset + 4] + 128) & 0xff) << 24) | (((long) (b[offset + 5] + 128) & 0xff) << 16)
| (((long) (b[offset + 6] + 128) & 0xff) << 8) | (((long) (b[offset + 7] + 128) & 0xff) << 0));
}
package com.younglibin; public final class TypeConversionUtil { private TypeConversionUtil() { } public static int byte2int(byte[] b, int offset) throws IllegalArgumentException { if (b == null || offset < 0 || b.length < offset + 4) { throw new IllegalArgumentException("target or startIndex error"); } return b[offset + 3] & 0xff | (b[offset + 2] & 0xff) << 8 | (b[offset + 1] & 0xff) << 16 | (b[offset] & 0xff) << 24; } public static void int2byte(int n, byte[] b, int offset) throws IllegalArgumentException { if (b == null || offset < 0 || b.length < offset + 4) { throw new IllegalArgumentException("target or startIndex error"); } b[offset] = (byte) (n >> 24); b[offset + 1] = (byte) (n >> 16); b[offset + 2] = (byte) (n >> 8); b[offset + 3] = (byte) n; } public static short byte2short(byte[] b, int offset) throws IllegalArgumentException { if (b == null || offset < 0 || b.length < offset + 2) { throw new IllegalArgumentException("target or startIndex error"); } return (short) (((b[offset] < 0 ? b[offset] + 256 : b[offset]) << 8) + (b[offset + 1] < 0 ? b[offset + 1] + 256 : b[offset + 1])); } public static void short2byte(short n, byte[] b, int offset) throws IllegalArgumentException { if (b == null || offset < 0 || b.length < offset + 2) { throw new IllegalArgumentException("target or startIndex error"); } b[offset] = (byte) ((n & 0xFF00) >> 8); b[offset + 1] = (byte) (n & 0xFF); } public static long byte2long(byte[] b, int offset) throws IllegalArgumentException { if (b == null || offset < 0 || b.length < offset + 8) { throw new IllegalArgumentException("target or startIndex error"); } return ((((long) b[offset] & 0xff) << 56) | (((long) b[offset + 1] & 0xff) << 48) | (((long) b[offset + 2] & 0xff) << 40) | (((long) b[offset + 3] & 0xff) << 32) | (((long) b[offset + 4] & 0xff) << 24) | (((long) b[offset + 5] & 0xff) << 16) | (((long) b[offset + 6] & 0xff) << 8) | (((long) b[offset + 7] & 0xff) << 0)); } public static void long2byte(long n, byte[] b, int offset) throws IllegalArgumentException { if (b == null || offset < 0 || b.length < offset + 8) { throw new IllegalArgumentException("target or startIndex error"); } b[offset + 0] = (byte) (n >> 56); b[offset + 1] = (byte) (n >> 48); b[offset + 2] = (byte) (n >> 40); b[offset + 3] = (byte) (n >> 32); b[offset + 4] = (byte) (n >> 24); b[offset + 5] = (byte) (n >> 16); b[offset + 6] = (byte) (n >> 8); b[offset + 7] = (byte) (n >> 0); } public static byte[] long2byte(long n) { byte[] b = new byte[8]; b[0] = (byte) (n >> 56); b[1] = (byte) (n >> 48); b[2] = (byte) (n >> 40); b[3] = (byte) (n >> 32); b[4] = (byte) (n >> 24); b[5] = (byte) (n >> 16); b[6] = (byte) (n >> 8); b[7] = (byte) (n >> 0); return b; } public static byte[] long2Orderbyte(long n) { byte[] b = new byte[8]; b[0] = (byte) ((byte) (n >> 56) - 128); b[1] = (byte) ((byte) (n >> 48) - 128); b[2] = (byte) ((byte) (n >> 40) - 128); b[3] = (byte) ((byte) (n >> 32) - 128); b[4] = (byte) ((byte) (n >> 24) - 128); b[5] = (byte) ((byte) (n >> 16) - 128); b[6] = (byte) ((byte) (n >> 8) - 128); b[7] = (byte) ((byte) (n >> 0) - 128); return b; } public static long orderByte2long(byte[] b, int offset) throws IllegalArgumentException { return ((((long) (b[offset] + 128) & 0xff) << 56) | (((long) (b[offset + 1] + 128) & 0xff) << 48) | (((long) (b[offset + 2] + 128) & 0xff) << 40) | (((long) (b[offset + 3] + 128) & 0xff) << 32) | (((long) (b[offset + 4] + 128) & 0xff) << 24) | (((long) (b[offset + 5] + 128) & 0xff) << 16) | (((long) (b[offset + 6] + 128) & 0xff) << 8) | (((long) (b[offset + 7] + 128) & 0xff) << 0)); } public static void main(String args[]) { int a = 99200, b = 99199; System.out.println("a>b:" + (a > b)); byte[] abyte = long2byte(a), bbyte = long2byte(b); System.out.println("abyte > abyte :" + compare(abyte, bbyte)); byte[] aNewbyte = long2Orderbyte(a), bNewbyte = long2Orderbyte(b); System.out.println("aNewbyte > aNewbyte : " + compare(aNewbyte, bNewbyte)); System.out.println("a = " + orderByte2long(aNewbyte, 0)); System.out.println("b = " + orderByte2long(bNewbyte, 0)); testOrder(); } public static void testOrder() { long b = 0; for (long a = 1; a < 100000; a++) { b = a - 1; byte[] aoldbyte = long2byte(a), boldbyte = long2byte(b); if (compare(aoldbyte, boldbyte) > 0) { } else if (compare(aoldbyte, boldbyte) < 0) { System.out.println("error" + a); } else { System.out.println("equals"); } } System.out.println("use order --------------------------"); for (long a = 1; a < 100000; a++) { b = a - 1; byte[] aoldbyte = long2Orderbyte(a), boldbyte = long2Orderbyte(b); if (compare(aoldbyte, boldbyte) > 0) { } else if (compare(aoldbyte, boldbyte) < 0) { System.out.println("error" + a); } else { System.out.println("equals"); } if (a != orderByte2long(aoldbyte, 0)) { System.out.println("use orderByte2long error:" + a); } if (b != orderByte2long(boldbyte, 0)) { System.out.println("use orderByte2long error:" + b); } } } public static int compare(byte[] a, byte[] b) { int index = 0; int reFlag = 0; while (index < 8) { if (a[index] > b[index]) { reFlag = 1; break; } else if (a[index] < b[index]) { reFlag = -1; break; } index++; } return reFlag; } }
相关推荐
* int 转换为 String:方式一:直接在数字后加一个空字符串,方式二:通过 String 类静态方法 valueOf() * String 转换为 int:方式一:先将字符串数字转成 Integer,然后调用 valueOf() 方法,方式二:通过 Integer...
`可以将`int`类型转换为`long`类型。 - **选项B**: 正确,显式类型转换。 - **选项C**: 错误,`int`类型不能直接赋值`long`类型的值。 - **选项D**: 错误,`int`类型不能直接赋值`long`类型的值。 **20. 变量...
- **数据转换规则**:基本数据类型按精度由低到高排序为:byte < short < char < int < long 。从低精度向高精度转换时,Java 会自动完成转换。相反,从高精度向低精度转换时,需要使用强制类型转换,例如 `(int)` ...
比如题目1中的byte相加,由于byte的范围不足以存储结果,因此会自动转换为int进行运算。题目2中,`short s=3;s=s+2`是安全的,因为计算时short会先转换为int。而`s+=2`同样安全,因为这是隐式类型提升。 4. Java...
- **htonl(unsigned long)**:将主机序转换为网络序(适用于32位数据) - **ntohs(unsigned short)**:将网络序转换为主机序(适用于16位数据) - **ntohl(unsigned long)**:将网络序转换为主机序(适用于32位数据...
自动类型转换的顺序是从低精度到高精度,依次为byte→short→int→long→float→double。 6. 同一学校中,人事部门的教师表和财务部门的工资表的关系是什么?(正确答案:A) 这是一种一对一(1:1)的关系,因为...
16. Java数据类型转换:按照从低到高,转换顺序为byte→short→int→long→float→double(正确答案:B)。 17. ASP.NET验证控件:SubmitValidator不是ASP.NET的验证控件,而是用于触发验证的控件(正确答案:D)。...
1. 基本数据类型:包括整数型(byte、short、int、long)、浮点型(float、double)、字符型(char)和布尔型(boolean)。这些类型在内存中占有固定大小的存储空间,并且它们的值在程序执行期间不能改变。 2. 引用...
Java中的基本数据类型有8种:boolean、char、byte、short、int、long、float、double。每种基本数据类型都有其默认值,例如整型的默认值为0,boolean类型的默认值为false,浮点类型的默认值为0.0,String类型的...
16. **域名系统(DNS)**:DNS负责将域名转换为IP地址,方便网络访问,D选项正确。 17. **C++程序编译过程**:编写好的C++程序需要经过编辑、编译、连接和运行四个步骤,B选项正确。 18. **Java程序执行**:题目中...
本资源摘要信息涵盖了 JavaSE 基础语法测试题库的多方面内容,涵盖了环境变量、Java 基本语法、基本数据类型、时间转换、控制台输出、数组操作、排序算法、查找算法等多方面的内容,为 Java 程序员提供了一个系统的...
关于类型转换,`int`可以强制转换为`byte`,但如果`int`的值超出`byte`的范围(-128至127),超出部分的高位会被截断,可能导致数据丢失或负数的出现。 类之间的转换也是Java中常见的操作。如果`B`继承`A`,`C`继承...
自动类型转换发生在数据类型从小到大转换时,例如,int可以自动转换为long或float。强制类型转换则需要显式进行,例如,将double转换为int时,可能丢失精度,因此需要使用括号(如(int)doubleValue)。 基本数据...
- Java中的基本数据类型包括`byte`, `short`, `int`, `long`, `float`, `double`, `boolean`和`char`。在实验中提到的`double`不能直接赋值给`float`,因为数据精度会丢失,编译器会报错。 - `float`型变量可以...
- **选择排序**:每次找到未排序部分的最小(大)值,放到正确位置,时间复杂度O(n^2)。 - **插入排序**:将未排序元素依次插入已排序序列,时间复杂度O(n^2)。 - **归并排序**:递归地将序列分为两半,分别排序...
JAVA中的基本类型包括整型(int、short、long、byte)、浮点型(float、double)、字符型(char)、布尔型(boolean)等。 **题目示例**: `char`类型的数值范围是多少? **解析**: 在JAVA中,`char`是一个无符号16位类型,...
Java有八种基本数据类型,分别是byte、short、int、long、float、double、char和boolean,它们定义了变量所能够存储的数据类型和范围。 9. 数据类型转换 数据类型转换分为自动类型转换(隐式)和强制类型转换(显式...
- 正确答案为 `B.byte→short→int→long→float→double`。 ### 12. 软件工程要素 - **知识点**: 软件工程的三个核心要素。 - **解释**: - 软件工程的三大要素包括工具、过程和方法。 - 正确答案为 `D.环境`,...
在C#中,值类型包括short、int、long、byte、float、double、decimal、bool和char,它们之间的转换有隐式和显示两种方式。隐式转换是从低精度类型到高精度类型自动进行,而显示转换则需要显式的类型转换操作。装箱和...