數值類型與字節數組之間的相互轉換

咱們在上文 如何選擇使用字符串仍是數字呢? 中闡述了使用數值類型的好處,那麼問題來了,如何在數值類型與字節數組之間相互轉換呢?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

相關文章
相關標籤/搜索