/* * Copyright (c) 2013, OpenCloudDB/MyCAT and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software;Designed and Developed mainly by many Chinese * opensource volunteers. you can redistribute it and/or modify it under the * terms of the GNU General Public License version 2 only, as published by the * Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Any questions about this component can be directed to it's project Web address * https://code.google.com/p/opencloudb/. * */ package org.opencloudb.util; import java.nio.charset.Charset; public class ByteUtil { /** * compare to number or dicamal ascii byte array, for number :123456 ,store * to array [1,2,3,4,5,6] * * @param b1 * @param b2 * @return -1 means b1 < b2, or 0 means b1=b2 else return 1 */ public static int compareNumberByte(byte[] b1, byte[] b2) { if(b1 == null || b1.length == 0) return -1; else if(b2 == null || b2.length == 0) return 1; boolean isNegetive = b1[0] == 45 || b2[0] == 45; if (isNegetive == false && b1.length != b2.length) { return b1.length - b2.length; } int len = b1.length > b2.length ? b2.length : b1.length; int result = 0; int index = -1; for (int i = 0; i < len; i++) { int b1val = b1[i]; int b2val = b2[i]; if (b1val > b2val) { result = 1; index = i; break; } else if (b1val < b2val) { index = i; result = -1; break; } } if (index == 0) { // first byte compare return result; } else { if( b1.length != b2.length ) { int lenDelta = b1.length - b2.length; return isNegetive ? 0 - lenDelta : lenDelta; } else { return isNegetive ? 0 - result : result; } } } public static byte[] compareNumberArray2(byte[] b1, byte[] b2, int order) { if (b1.length <= 0 && b2.length > 0) { return b2; } if (b1.length > 0 && b2.length <= 0) { return b1; } int len = b1.length > b2.length ? b1.length : b2.length; for (int i = 0; i < len; i++) { if (b1[i] != b2[i]) if (order == 1) return ((b1[i] & 0xff) - (b2[i] & 0xff)) > 0 ? b1 : b2; else return ((b1[i] & 0xff) - (b2[i] & 0xff)) > 0 ? b2 : b1; } return b1; } public static byte[] getBytes(short data) { byte[] bytes = new byte[2]; bytes[0] = (byte) (data & 0xff); bytes[1] = (byte) ((data & 0xff00) >> 8); return bytes; } public static byte[] getBytes(char data) { byte[] bytes = new byte[2]; bytes[0] = (byte) (data); bytes[1] = (byte) (data >> 8); return bytes; } public static byte[] getBytes(int data) { byte[] bytes = new byte[4]; bytes[0] = (byte) (data & 0xff); bytes[1] = (byte) ((data & 0xff00) >> 8); bytes[2] = (byte) ((data & 0xff0000) >> 16); bytes[3] = (byte) ((data & 0xff000000) >> 24); return bytes; } public static byte[] getBytes(long data) { byte[] bytes = new byte[8]; bytes[0] = (byte) (data & 0xff); bytes[1] = (byte) ((data >> 8) & 0xff); bytes[2] = (byte) ((data >> 16) & 0xff); bytes[3] = (byte) ((data >> 24) & 0xff); bytes[4] = (byte) ((data >> 32) & 0xff); bytes[5] = (byte) ((data >> 40) & 0xff); bytes[6] = (byte) ((data >> 48) & 0xff); bytes[7] = (byte) ((data >> 56) & 0xff); return bytes; } public static byte[] getBytes(float data) { int intBits = Float.floatToIntBits(data); return getBytes(intBits); } public static byte[] getBytes(double data) { long intBits = Double.doubleToLongBits(data); return getBytes(intBits); } public static byte[] getBytes(String data, String charsetName) { Charset charset = Charset.forName(charsetName); return data.getBytes(charset); } public static byte[] getBytes(String data) { return getBytes(data, "GBK"); } public static short getShort(byte[] bytes) { return (short) ((0xff & bytes[0]) | (0xff00 & (bytes[1] << 8))); } public static char getChar(byte[] bytes) { return (char) ((0xff & bytes[0]) | (0xff00 & (bytes[1] << 8))); } public static int getInt(byte[] bytes) { return Integer.parseInt(new String(bytes)); // return (0xff & bytes[0]) | (0xff00 & (bytes[1] << 8)) | (0xff0000 & // (bytes[2] << 16)) | (0xff000000 & (bytes[3] << 24)); } public static long getLong(byte[] bytes) { return Long.parseLong(new String(bytes)); // return(0xffL & (long)bytes[0]) | (0xff00L & ((long)bytes[1] << 8)) | // (0xff0000L & ((long)bytes[2] << 16)) | (0xff000000L & ((long)bytes[3] // << 24)) // | (0xff00000000L & ((long)bytes[4] << 32)) | (0xff0000000000L & // ((long)bytes[5] << 40)) | (0xff000000000000L & ((long)bytes[6] << // 48)) | (0xff00000000000000L & ((long)bytes[7] << 56)); } public static double getDouble(byte[] bytes) { return Double.parseDouble(new String(bytes)); } public static String getString(byte[] bytes, String charsetName) { return new String(bytes, Charset.forName(charsetName)); } public static String getString(byte[] bytes) { return getString(bytes, "UTF-8"); } public static String getDate(byte[] bytes) { return new String(bytes); } public static String getTimestmap(byte[] bytes) { return new String(bytes); } }