咱們在上文 如何選擇使用字符串仍是數字呢? 中闡述了使用數值類型的好處,那麼問題來了,如何在數值類型與字節數組之間相互轉換呢?java
咱們先看看單個數值類型和字節數組之間的轉換,咱們以Integer類型爲例:數組
public static byte[] intToBytes(int x) { ByteBuffer intBuffer = ByteBuffer.allocate(Integer.BYTES); intBuffer.putInt(0, x); return intBuffer.array(); } public static int bytesToInt(byte[] bytes) { return bytesToInt(bytes, 0, bytes.length); } public static int bytesToInt(byte[] bytes, int offset, int length) { ByteBuffer intBuffer = ByteBuffer.allocate(Integer.BYTES); intBuffer.put(bytes, offset, length); intBuffer.flip(); return intBuffer.getInt(); }
接着咱們看看多個數值類型和字節數組之間的轉換,咱們以Long集合和字節數組之間轉換爲例:.net
public static byte[] longSetToBytes(Collection<Long> ids){ int len = ids.size()*Long.BYTES; ByteBuffer byteBuffer = ByteBuffer.allocate(len); int start = 0; for(Long id : ids){ byteBuffer.putLong(start, id); start += Long.BYTES; } return byteBuffer.array(); } public static Set<Long> bytesToLongSet(byte[] bytes){ return bytesToLongSet(bytes, 0, bytes.length); } public static Set<Long> bytesToLongSet(byte[] bytes, int offset, int length){ Set<Long> ids = new HashSet<>(); ByteBuffer byteBuffer = ByteBuffer.allocate(length); byteBuffer.put(bytes, offset, length); byteBuffer.flip(); int count = length/Long.BYTES; for(int i=0; i<count; i++) { ids.add(byteBuffer.getLong()); } return ids; }
因爲ByteBuffer支持5種數值類型,對於咱們在數值類型和字節數組之間的轉換提供了完備的支持,以下圖所示:code