因此,一個長(在Java中說)爲8個字節大小,並且可以存儲相當大的數字。我想將它轉換爲字符串,但不會丟失內存。基本上需要100個數字(800字節),將它們轉換爲一個字符串(即接近800字節),然後當我需要它將其轉換回數組。數轉換爲字符串,而不會失去記憶
這個問題的推理是我想在我的JWT令牌中存儲不少數字,所以如果我把它們當作字符串,那麼這些數字的大小將比理想值大得多世界。任何想法如何實現這一目標?
因此,一個長(在Java中說)爲8個字節大小,並且可以存儲相當大的數字。我想將它轉換爲字符串,但不會丟失內存。基本上需要100個數字(800字節),將它們轉換爲一個字符串(即接近800字節),然後當我需要它將其轉換回數組。數轉換爲字符串,而不會失去記憶
這個問題的推理是我想在我的JWT令牌中存儲不少數字,所以如果我把它們當作字符串,那麼這些數字的大小將比理想值大得多世界。任何想法如何實現這一目標?
這基本上是序列化。轉儲長值到字節數組,然後將其編碼成相容表示,如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編碼它之後。根據輸入的大小,數字的性質(例如它們是否處於一定範圍內)以及壓縮算法,您可能會獲得更多或更少的成功,但是如果數字隨機分佈在整個範圍內長數字你可能無法壓縮很多。
+1爲真正的回答言簡意賅和信用/參照從您的溶液吸入現有的SO問題。 –
@jdehesa,我認爲,你不是建議將它連續化爲一個整體對象(long數組),僅僅因爲它不是緊湊的?或者我在這裏錯過了一些東西。 – eddyP23
@ eddyP23好吧,我假設你想要一些簡單和可互操作的格式。我不能說標準的Java序列化引入了多少開銷,雖然它沒有針對大小進行優化(並且它將不得不存儲額外的信息,例如數組的大小)。您還可以看看[其他序列庫(https://stackoverflow.com/questions/239280/which-is-the-best-alternative-for-java-serialization)如[KRYO(https://開頭github上。 COM/EsotericSoftware/KRYO)。在任何情況下,如果使用二進制序列化,則需要一些與文本兼容的編碼。 – jdehesa