java處理字節(jié)的常用工具類(lèi)
處理字節(jié)的常用工具類(lèi)方法,供大家參考,具體內(nèi)容如下
package com.demo.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.nio.charset.Charset; import java.util.Arrays; /** * 處理字節(jié)的常用工具類(lèi)方法 * @author dongyangyang * @Date 2017/3/13 12:31 * @Version 1.0 * */ public class ByteUtils { /** * 構(gòu)造新字節(jié)時(shí)需要與的值表 */ private static final byte[] BUILD_BYTE_TABLE = new byte[] { (byte) 128, (byte) 64, (byte) 32, (byte) 16, (byte) 8, (byte) 4, (byte) 2, (byte) 1 }; private ByteUtils() {} /** * short轉(zhuǎn)換到字節(jié)數(shù)組 * * @param number * 需要轉(zhuǎn)換的數(shù)據(jù)。 * @return 轉(zhuǎn)換后的字節(jié)數(shù)組。 */ public static byte[] shortToByte(short number) { byte[] b = new byte[2]; for (int i = 1; i >= 0; i--) { b[i] = (byte) (number % 256); number >>= 8; } return b; } /** * 字節(jié)到short轉(zhuǎn)換 * * @param b * short的字節(jié)數(shù)組 * @return short數(shù)值。 */ public static short byteToShort(byte[] b) { return (short) ((((b[0] & 0xff) << 8) | b[1] & 0xff)); } /** * 整型轉(zhuǎn)換到字節(jié)數(shù)組 * * @param number * 整形數(shù)據(jù)。 * @return 整形數(shù)據(jù)的字節(jié)數(shù)組。 */ public static byte[] intToByte(int number) { byte[] b = new byte[4]; for (int i = 3; i >= 0; i--) { b[i] = (byte) (number % 256); number >>= 8; } return b; } /** * 字節(jié)數(shù)組到整型轉(zhuǎn)換 * * @param b * 整形數(shù)據(jù)的字節(jié)數(shù)組。 * @return 字節(jié)數(shù)組轉(zhuǎn)換成的整形數(shù)據(jù)。 */ public static int byteToInt(byte[] b) { return ((((b[0] & 0xff) << 24) | ((b[1] & 0xff) << 16) | ((b[2] & 0xff) << 8) | (b[3] & 0xff))); } /** * long轉(zhuǎn)換到字節(jié)數(shù)組 * * @param number * 長(zhǎng)整形數(shù)據(jù)。 * @return 長(zhǎng)整形轉(zhuǎn)換成的字節(jié)數(shù)組。 */ public static byte[] longToByte(long number) { byte[] b = new byte[8]; for (int i = 7; i >= 0; i--) { b[i] = (byte) (number % 256); number >>= 8; } return b; } /** * 字節(jié)數(shù)組到整型的轉(zhuǎn)換 * * @param b * 長(zhǎng)整形字節(jié)數(shù)組。 * @return 長(zhǎng)整形數(shù)據(jù)。 */ public static long byteToLong(byte[] b) { return ((((long) b[0] & 0xff) << 56) | (((long) b[1] & 0xff) << 48) | (((long) b[2] & 0xff) << 40) | (((long) b[3] & 0xff) << 32) | (((long) b[4] & 0xff) << 24) | (((long) b[5] & 0xff) << 16) | (((long) b[6] & 0xff) << 8) | ((long) b[7] & 0xff)); } /** * double轉(zhuǎn)換到字節(jié)數(shù)組 * * @param d * 雙精度浮點(diǎn)。 * @return 雙精度浮點(diǎn)的字節(jié)數(shù)組。 */ public static byte[] doubleToByte(double d) { byte[] bytes = new byte[8]; long l = Double.doubleToLongBits(d); for (int i = 0; i < bytes.length; i++) { bytes[i] = Long.valueOf(l).byteValue(); l = l >> 8; } return bytes; } /** * 字節(jié)數(shù)組到double轉(zhuǎn)換 * * @param b * 雙精度浮點(diǎn)字節(jié)數(shù)組。 * @return 雙精度浮點(diǎn)數(shù)據(jù)。 */ public static double byteToDouble(byte[] b) { long l; l = b[0]; l &= 0xff; l |= ((long) b[1] << 8); l &= 0xffff; l |= ((long) b[2] << 16); l &= 0xffffff; l |= ((long) b[3] << 24); l &= 0xffffffffl; l |= ((long) b[4] << 32); l &= 0xffffffffffl; l |= ((long) b[5] << 40); l &= 0xffffffffffffl; l |= ((long) b[6] << 48); l &= 0xffffffffffffffl; l |= ((long) b[7] << 56); return Double.longBitsToDouble(l); } /** * float轉(zhuǎn)換到字節(jié)數(shù)組 * * @param d * 浮點(diǎn)型數(shù)據(jù)。 * @return 浮點(diǎn)型數(shù)據(jù)轉(zhuǎn)換后的字節(jié)數(shù)組。 */ public static byte[] floatToByte(float d) { byte[] bytes = new byte[4]; int l = Float.floatToIntBits(d); for (int i = 0; i < bytes.length; i++) { bytes[i] = Integer.valueOf(l).byteValue(); l = l >> 8; } return bytes; } /** * 字節(jié)數(shù)組到float的轉(zhuǎn)換 * * @param b * 浮點(diǎn)型數(shù)據(jù)字節(jié)數(shù)組。 * @return 浮點(diǎn)型數(shù)據(jù)。 */ public static float byteToFloat(byte[] b) { int l; l = b[0]; l &= 0xff; l |= ((long) b[1] << 8); l &= 0xffff; l |= ((long) b[2] << 16); l &= 0xffffff; l |= ((long) b[3] << 24); l &= 0xffffffffl; return Float.intBitsToFloat(l); } /** * 字符串到字節(jié)數(shù)組轉(zhuǎn)換 * * @param s * 字符串。 * @param charset * 字符編碼 * @return 字符串按相應(yīng)字符編碼編碼后的字節(jié)數(shù)組。 */ public static byte[] stringToByte(String s, Charset charset) { return s.getBytes(charset); } /** * 字節(jié)數(shù)組帶字符串的轉(zhuǎn)換 * * @param b * 字符串按指定編碼轉(zhuǎn)換的字節(jié)數(shù)組。 * @param charset * 字符編碼。 * @return 字符串。 */ public static String byteToString(byte[] b, Charset charset) { return new String(b, charset); } /** * 對(duì)象轉(zhuǎn)換成字節(jié)數(shù)組。 * * @param obj * 字節(jié)數(shù)組。 * @return 對(duì)象實(shí)例相應(yīng)的序列化后的字節(jié)數(shù)組。 * @throws IOException */ public static byte[] objectToByte(Object obj) throws IOException { ByteArrayOutputStream buff = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(buff); out.writeObject(obj); try { return buff.toByteArray(); } finally { out.close(); } } /** * 序死化字節(jié)數(shù)組轉(zhuǎn)換成實(shí)際對(duì)象。 * * @param b * 字節(jié)數(shù)組。 * @return 對(duì)象。 * @throws IOException * @throws ClassNotFoundException */ public static Object byteToObject(byte[] b) throws IOException, ClassNotFoundException { ByteArrayInputStream buff = new ByteArrayInputStream(b); ObjectInputStream in = new ObjectInputStream(buff); Object obj = in.readObject(); try { return obj; } finally { in.close(); } } /** * 比較兩個(gè)字節(jié)的每一個(gè)bit位是否相等. * * @param a * 比較的字節(jié). * @param b * 比較的字節(jié) * @return ture 兩個(gè)字節(jié)每一位都相等,false有至少一位不相等. */ public static boolean equalsBit(byte a, byte b) { return Arrays.equals(byteToBitArray(a), byteToBitArray(b)); } /** * 比較兩個(gè)數(shù)組中的每一個(gè)字節(jié),兩個(gè)字節(jié)必須二進(jìn)制字節(jié)碼每一位都相同才表示兩個(gè) byte相同. * * @param a * 比較的字節(jié)數(shù)組. * @param b * 被比較的字節(jié)數(shù). * @return ture每一個(gè)元素的每一位兩個(gè)數(shù)組都是相等的,false至少有一位不相等. */ public static boolean equalsBit(byte[] a, byte[] b) { if (a == b) { return true; } if (a == null || b == null) { return false; } int length = a.length; if (b.length != length) { return false; } for (int count = 0; count < a.length; count++) { if (!equalsBit(a[count], b[count])) { return false; } } return true; } /** * 返回某個(gè)字節(jié)的bit組成的字符串. * * @param b * 字節(jié). * @return Bit位組成的字符串. */ public static String bitString(byte b) { StringBuilder buff = new StringBuilder(); boolean[] array = byteToBitArray(b); for (int i = 0; i < array.length; i++) { buff.append(array[i] ? 1 : 0); } return buff.toString(); } /** * 計(jì)算出給定byte中的每一位,并以一個(gè)布爾數(shù)組返回. true表示為1,false表示為0. * * @param b * 字節(jié). * @return 指定字節(jié)的每一位bit組成的數(shù)組. */ public static boolean[] byteToBitArray(byte b) { boolean[] buff = new boolean[8]; int index = 0; for (int i = 7; i >= 0; i--) { buff[index++] = ((b >>> i) & 1) == 1; } return buff; } /** * 返回指定字節(jié)中指定bit位,true為1,false為0. 指定的位從0-7,超出將拋出數(shù)據(jù)越界異常. * * @param b * 需要判斷的字節(jié). * @param index * 字節(jié)中指定位. * @return 指定位的值. */ public static boolean byteBitValue(byte b, int index) { return byteToBitArray(b)[index]; } /** * 根據(jù)布爾數(shù)組表示的二進(jìn)制構(gòu)造一個(gè)新的字節(jié). * * @param values * 布爾數(shù)組,其中true表示為1,false表示為0. * @return 構(gòu)造的新字節(jié). */ public static byte buildNewByte(boolean[] values) { byte b = 0; for (int i = 0; i < 8; i++) { if (values[i]) { b |= BUILD_BYTE_TABLE[i]; } } return b; } /** * 將指定字節(jié)中的某個(gè)bit位替換成指定的值,true代表1,false代表0. * * @param b * 需要被替換的字節(jié). * @param index * 位的序號(hào),從0開(kāi)始.超過(guò)7將拋出越界異常. * @param newValue * 新的值. * @return 替換好某個(gè)位值的新字節(jié). */ public static byte changeByteBitValue(byte b, int index, boolean newValue) { boolean[] bitValues = byteToBitArray(b); bitValues[index] = newValue; return buildNewByte(bitValues); } /** * 將指定的IP地址轉(zhuǎn)換成字節(jié)表示方式. IP數(shù)組的每一個(gè)數(shù)字都不能大于255,否則將拋出IllegalArgumentException異常. * * @param ipNums * IP地址數(shù)組. * @return IP地址字節(jié)表示方式. */ public static byte[] ipAddressBytes(String address) { if (address == null || address.length() < 0 || address.length() > 15) { throw new IllegalArgumentException("Invalid IP address."); } final int ipSize = 4;// 最大IP位數(shù) final char ipSpace = '.';// IP數(shù)字的分隔符 int[] ipNums = new int[ipSize]; StringBuilder number = new StringBuilder();// 當(dāng)前操作的數(shù)字 StringBuilder buff = new StringBuilder(address); int point = 0;// 當(dāng)前操作的數(shù)字下標(biāo),最大到3. char currentChar; for (int i = 0; i < buff.length(); i++) { currentChar = buff.charAt(i); if (ipSpace == currentChar) { // 當(dāng)前位置等于最大于序號(hào)后,還有字符沒(méi)有處理表示這是一個(gè)錯(cuò)誤的IP. if (point == ipSize - 1 && buff.length() - (i + 1) > 0) { throw new IllegalArgumentException("Invalid IP address."); } ipNums[point++] = Integer.parseInt(number.toString()); number.delete(0, number.length()); } else { number.append(currentChar); } } ipNums[point] = Integer.parseInt(number.toString()); byte[] ipBuff = new byte[ipSize]; int pointNum = 0; for (int i = 0; i < 4; i++) { pointNum = Math.abs(ipNums[i]); if (pointNum > 255) { throw new IllegalArgumentException("Invalid IP address."); } ipBuff[i] = (byte) (pointNum & 0xff); } return ipBuff; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 深入淺析Java常用的格式化Json工具類(lèi)
- Java常用工具類(lèi)庫(kù)——Hutool的使用簡(jiǎn)介
- Java常用工具類(lèi)匯總 附示例代碼
- Java常用類(lèi)庫(kù)Apache Commons工具類(lèi)說(shuō)明及使用實(shí)例詳解
- java常用工具類(lèi) Reflect反射工具類(lèi)、String字符串工具類(lèi)
- java常用工具類(lèi) Date日期、Mail郵件工具類(lèi)
- java常用工具類(lèi) UUID、Map工具類(lèi)
- java常用工具類(lèi) Random隨機(jī)數(shù)、MD5加密工具類(lèi)
- java常用工具類(lèi) 數(shù)字工具類(lèi)
- java常用工具類(lèi) XML工具類(lèi)、數(shù)據(jù)驗(yàn)證工具類(lèi)
- java常用工具類(lèi) IP、File文件工具類(lèi)
- 詳解Java常用工具類(lèi)—泛型
- Java常用工具類(lèi)—集合排序
- java自定義封裝StringUtils常用工具類(lèi)
- 常用java正則表達(dá)式的工具類(lèi)
- Java語(yǔ)言Lang包下常用的工具類(lèi)介紹
- Java_int、double型數(shù)組常用操作工具類(lèi)(分享)
- Java常用工具類(lèi)總結(jié)
相關(guān)文章
詳解使用Spring Cloud Consul實(shí)現(xiàn)服務(wù)的注冊(cè)和發(fā)現(xiàn)
這篇文章主要介紹了詳解使用Spring Cloud Consul實(shí)現(xiàn)服務(wù)的注冊(cè)和發(fā)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Spring boot將配置屬性注入到bean類(lèi)中
本篇文章主要介紹了Spring boot將配置屬性注入到bean類(lèi)中,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03如何基于Idea遠(yuǎn)程調(diào)試tomcat war包及jar包
這篇文章主要介紹了如何基于Idea遠(yuǎn)程調(diào)試tomcat war包及jar包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08JAVA實(shí)現(xiàn)FTP斷點(diǎn)上傳的方法
這篇文章主要介紹了JAVA實(shí)現(xiàn)FTP斷點(diǎn)上傳的方法,涉及java使用FTP實(shí)現(xiàn)文件傳輸?shù)南嚓P(guān)技巧,需要的朋友可以參考下2015-06-06Spring Boot Admin郵件警報(bào)整合過(guò)程解析
這篇文章主要介紹了Spring Boot Admin郵件警報(bào)整合過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03解決idea?中?SpringBoot?點(diǎn)擊運(yùn)行沒(méi)反應(yīng)按鈕成灰色的問(wèn)題
在使用 Spring Boot 開(kāi)發(fā)項(xiàng)目時(shí),可能會(huì)遇到一個(gè)問(wèn)題:點(diǎn)擊運(yùn)行按鈕后,控制臺(tái)沒(méi)有任何輸出,項(xiàng)目界面也沒(méi)有顯示,這種情況可能是由多種原因?qū)е碌模疚膶⒔榻B一些常見(jiàn)的解決方法,需要的朋友可以參考下2023-08-08