2017-08-31 142 views
0

因此,一個長(在Java中說)爲8個字節大小,並且可以存儲相當大的數字。我想將它轉換爲字符串,但不會丟失內存。基本上需要100個數字(800字節),將它們轉換爲一個字符串(即接近800字節),然後當我需要它將其轉換回數組。數轉換爲字符串,而不會失去記憶

這個問題的推理是我想在我的JWT令牌中存儲不少數字,所以如果我把它們當作字符串,那麼這些數字的大小將比理想值大得多世界。任何想法如何實現這一目標?

回答

2

這基本上是序列化。轉儲長值到字節數組,然後將其編碼成相容表示,如Base64

import java.util.Base64; 

public String encodeLongs(long[] numbers) { 
    byte[] bytes = new byte[8 * numbers.length]; 
    for (int i = 0; i < numbers.length; i++) { 
     // Taken from https://stackoverflow.com/questions/18687772/java-converting-long-to-bytes-which-approach-is-more-efficient 
     long v = numbers[i]; 
     int idx = i * 8; 
     bytes[idx + 0] = (byte)(v >>> 56); 
     bytes[idx + 1] = (byte)(v >>> 48); 
     bytes[idx + 2] = (byte)(v >>> 40); 
     bytes[idx + 3] = (byte)(v >>> 32); 
     bytes[idx + 4] = (byte)(v >>> 24); 
     bytes[idx + 5] = (byte)(v >>> 16); 
     bytes[idx + 6] = (byte)(v >>> 8); 
     bytes[idx + 7] = (byte)(v >>> 0); 
    } 
    return Base64.getEncoder().encodeToString(bytes); 
} 

您也可以返回一個字符串的字節數組,而不是如果這是你更方便。 Base64編碼的開銷約爲原始大小的1/3(假設您使用UTF-8或類似編碼)。請注意,這是不可能有一般的,如果你使用的是基於文本的格式零開銷,雖然你可以調查其他編碼如Base-122,雖然Base64編碼有被無處不在,在大多數語言中已經實施的優勢。

另一種選擇是,以第一壓縮字節陣列(例如用GZIP)和以Base64編碼它之後。根據輸入的大小,數字的性質(例如它們是否處於一定範圍內)以及壓縮算法,您可能會獲得更多或更少的成功,但是如果數字隨機分佈在整個範圍內長數字你可能無法壓縮很多。

+0

+1爲真正的回答言簡意賅和信用/參照從您的溶液吸入現有的SO問題。 –

+0

@jdehesa,我認爲,你不是建議將它連續化爲一個整體對象(long數組),僅僅因爲它不是緊湊的?或者我在這裏錯過了一些東西。 – eddyP23

+1

@ eddyP23好吧,我假設你想要一些簡單和可互操作的格式。我不能說標準的Java序列化引入了多少開銷,雖然它沒有針對大小進行優化(並且它將不得不存儲額外的信息,例如數組的大小)。您還可以看看[其他序列庫(https://stackoverflow.com/questions/239280/which-is-the-best-alternative-for-java-serialization)如[KRYO(https://開頭github上。 COM/EsotericSoftware/KRYO)。在任何情況下,如果使用二進制序列化,則需要一些與文本兼容的編碼。 – jdehesa

相關問題