`
younglibin
  • 浏览: 1210861 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

long 转换为 byte后正确排序

 
阅读更多

  关于 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;
	}
}

 

分享到:
评论

相关推荐

    day04-常用API&异常1

    * int 转换为 String:方式一:直接在数字后加一个空字符串,方式二:通过 String 类静态方法 valueOf() * String 转换为 int:方式一:先将字符串数字转成 Integer,然后调用 valueOf() 方法,方式二:通过 Integer...

    java期末复习题.doc

    `可以将`int`类型转换为`long`类型。 - **选项B**: 正确,显式类型转换。 - **选项C**: 错误,`int`类型不能直接赋值`long`类型的值。 - **选项D**: 错误,`int`类型不能直接赋值`long`类型的值。 **20. 变量...

    开放实验实践基础部分.pdf

    - **数据转换规则**:基本数据类型按精度由低到高排序为:byte &lt; short &lt; char &lt; int &lt; long 。从低精度向高精度转换时,Java 会自动完成转换。相反,从高精度向低精度转换时,需要使用强制类型转换,例如 `(int)` ...

    淘淘商城_专项复习训练

    比如题目1中的byte相加,由于byte的范围不足以存储结果,因此会自动转换为int进行运算。题目2中,`short s=3;s=s+2`是安全的,因为计算时short会先转换为int。而`s+=2`同样安全,因为这是隐式类型提升。 4. Java...

    关于.txt总结

    - **htonl(unsigned long)**:将主机序转换为网络序(适用于32位数据) - **ntohs(unsigned short)**:将网络序转换为主机序(适用于16位数据) - **ntohl(unsigned long)**:将网络序转换为主机序(适用于32位数据...

    2021-2022计算机二级等级考试试题及答案No.2566.docx

    自动类型转换的顺序是从低精度到高精度,依次为byte→short→int→long→float→double。 6. 同一学校中,人事部门的教师表和财务部门的工资表的关系是什么?(正确答案:A) 这是一种一对一(1:1)的关系,因为...

    2021-2022计算机二级等级考试试题及答案No.9179.docx

    16. Java数据类型转换:按照从低到高,转换顺序为byte→short→int→long→float→double(正确答案:B)。 17. ASP.NET验证控件:SubmitValidator不是ASP.NET的验证控件,而是用于触发验证的控件(正确答案:D)。...

    黑马面试题汇总(理论部分)分享.pdf

    1. 基本数据类型:包括整数型(byte、short、int、long)、浮点型(float、double)、字符型(char)和布尔型(boolean)。这些类型在内存中占有固定大小的存储空间,并且它们的值在程序执行期间不能改变。 2. 引用...

    2023年java面试基础总结.doc

    Java中的基本数据类型有8种:boolean、char、byte、short、int、long、float、double。每种基本数据类型都有其默认值,例如整型的默认值为0,boolean类型的默认值为false,浮点类型的默认值为0.0,String类型的...

    2021-2022计算机二级等级考试试题及答案No.12534.docx

    16. **域名系统(DNS)**:DNS负责将域名转换为IP地址,方便网络访问,D选项正确。 17. **C++程序编译过程**:编写好的C++程序需要经过编辑、编译、连接和运行四个步骤,B选项正确。 18. **Java程序执行**:题目中...

    JavaSE基础语法测试题库

    本资源摘要信息涵盖了 JavaSE 基础语法测试题库的多方面内容,涵盖了环境变量、Java 基本语法、基本数据类型、时间转换、控制台输出、数组操作、排序算法、查找算法等多方面的内容,为 Java 程序员提供了一个系统的...

    Java 基础(3-8) - 图谱 & Q-A.pdf

    关于类型转换,`int`可以强制转换为`byte`,但如果`int`的值超出`byte`的范围(-128至127),超出部分的高位会被截断,可能导致数据丢失或负数的出现。 类之间的转换也是Java中常见的操作。如果`B`继承`A`,`C`继承...

    ppy资源分析

    自动类型转换发生在数据类型从小到大转换时,例如,int可以自动转换为long或float。强制类型转换则需要显式进行,例如,将double转换为int时,可能丢失精度,因此需要使用括号(如(int)doubleValue)。 基本数据...

    Java语言程序设计(2,3)[参考].pdf

    - Java中的基本数据类型包括`byte`, `short`, `int`, `long`, `float`, `double`, `boolean`和`char`。在实验中提到的`double`不能直接赋值给`float`,因为数据精度会丢失,编译器会报错。 - `float`型变量可以...

    java面试基础总结.doc

    - **选择排序**:每次找到未排序部分的最小(大)值,放到正确位置,时间复杂度O(n^2)。 - **插入排序**:将未排序元素依次插入已排序序列,时间复杂度O(n^2)。 - **归并排序**:递归地将序列分为两半,分别排序...

    JAVA面试大全

    JAVA中的基本类型包括整型(int、short、long、byte)、浮点型(float、double)、字符型(char)、布尔型(boolean)等。 **题目示例**: `char`类型的数值范围是多少? **解析**: 在JAVA中,`char`是一个无符号16位类型,...

    Java基础语言的笔记

    Java有八种基本数据类型,分别是byte、short、int、long、float、double、char和boolean,它们定义了变量所能够存储的数据类型和范围。 9. 数据类型转换 数据类型转换分为自动类型转换(隐式)和强制类型转换(显式...

    2021-2022计算机二级等级考试试题及答案No.17814.docx

    - 正确答案为 `B.byte→short→int→long→float→double`。 ### 12. 软件工程要素 - **知识点**: 软件工程的三个核心要素。 - **解释**: - 软件工程的三大要素包括工具、过程和方法。 - 正确答案为 `D.环境`,...

    c#与asp.net学习总结(基础)

    在C#中,值类型包括short、int、long、byte、float、double、decimal、bool和char,它们之间的转换有隐式和显示两种方式。隐式转换是从低精度类型到高精度类型自动进行,而显示转换则需要显式的类型转换操作。装箱和...

Global site tag (gtag.js) - Google Analytics