主頁 > 後端開發 > Java 解壓后的位元組再進行壓縮長度改變是什么原因?

Java 解壓后的位元組再進行壓縮長度改變是什么原因?

2020-09-14 11:16:53 後端開發

這段經過Base64編碼的字串,經過解碼與解壓之后,會得到一串xml格式的檔案。
對這一串字符再進行壓縮與編碼,得到的最終長度與原字串長度卻不一致。

在解壓操作時,如果必須在setInput方法中設定offset 32,否則會提示如下錯誤
java.util.zip.DataFormatException: incorrect header check


在再次壓縮的程序中,卻不知道如何設定offset,壓縮的字串長度比未解壓的字串長度少了32位元組。

并且使用這種方法壓縮后的資料是無法再解壓的。

困擾很久的問題,非常期待得到幫助。

package test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Base64;
import java.util.zip.Deflater;
import java.util.zip.Inflater;

public class Test2 {

public static void main(String[] args) {

try {

String encodedText = "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";
Base64.Decoder decoder = Base64.getDecoder();

//解碼字串,回傳位元組陣列
byte[] output = decoder.decode(encodedText);

//得到位元組陣列長度 3172
int output_length = output.length;

ByteArrayOutputStream xmlout = new ByteArrayOutputStream (10000);

//解壓
Inflater decompress = new Inflater();
decompress.setInput(output, 32, output_length-32);
boolean b1 = decompress.needsDictionary();
boolean b2 = decompress.needsInput();
int a1 = decompress.getTotalIn();
int a2 = decompress.getTotalOut();
do {
 
         byte[] result = new byte[1000];
         int ab = decompress.getAdler();
         int resultLength = decompress.inflate(result);  
         xmlout.write(result, 0, resultLength);
 
} while (!decompress.finished());
 
int finalsize = (int)decompress.getBytesWritten();

//得到解壓縮后的字串:<?xml version="1.0" encoding="UTF-16" ?><Adobe_Root><Adobe_Title><Version>20。。。。。</Adobe_Root>
String finalStr = new String(xmlout.toByteArray(),0,finalsize, "unicode");

//再次執行壓縮操作
byte[] input = finalStr.getBytes("unicode");

byte[] input_result = new byte[100000];
Deflater compresser = new Deflater();

//compresser.setInput(input);
compresser.setInput(input, 0, input.length);
compresser.finish();

  
//得到壓縮的字串長度:3140,比未解壓縮之前少了32位元組
int compressedDataLength = compresser.deflate(input_result);  
            byte[] contentByte = new byte[compressedDataLength];  
            
            System.arraycopy(output, 0, contentByte, 0, compressedDataLength);  
            
            String s2 = new String(contentByte);
            

//編碼
Base64.Encoder encoder = Base64.getEncoder();

byte[] result2 = encoder.encode(contentByte);
String a = new String(contentByte);
System.out.println(a.length());

System.out.println(new String(result2));
System.out.println(new String(result2));

//new String(xmlout.toByteArray(),0,)
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}

}
}

uj5u.com熱心網友回復:

//解壓
            Inflater decompress = new Inflater(true);

uj5u.com熱心網友回復:

參考 1 樓 Farmermark993 的回復:
//解壓
            Inflater decompress = new Inflater(true);

測驗過,不行。必須要得到原來的壓縮字串

uj5u.com熱心網友回復:

有沒有好的辦法嗎?

uj5u.com熱心網友回復:

參考 樓主 fengda2870 的回復:
這段經過Base64編碼的字串,經過解碼與解壓之后,會得到一串xml格式的檔案。
對這一串字符再進行壓縮與編碼,得到的最終長度與原字串長度卻不一致。

在解壓操作時,如果必須在setInput方法中設定offset 32,否則會提示如下錯誤
java.util.zip.DataFormatException: incorrect header check


在再次壓縮的程序中,卻不知道如何設定offset,壓縮的字串長度比未解壓的字串長度少了32位元組。

并且使用這種方法壓縮后的資料是無法再解壓的。

困擾很久的問題,非常期待得到幫助。


試試看一下面的程式


public class Test2 {

public static void main(String[] args) {

try {

String encodedText = "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";
Base64.Decoder decoder = Base64.getDecoder();

//解碼字串,回傳位元組陣列
byte[] output = decoder.decode(encodedText);

for (int i = 0; i < output.length; ++i) {
if (output[i] < 0) {
output[i] += 256;
}
}

//得到位元組陣列長度 3172
int output_length = output.length;

ByteArrayOutputStream xmlout = new ByteArrayOutputStream (10000);

//解壓
Inflater decompress = new Inflater();
decompress.setInput(output, 32, output_length-32);
boolean b1 = decompress.needsDictionary();
boolean b2 = decompress.needsInput();
int a1 = decompress.getTotalIn();
int a2 = decompress.getTotalOut();
do {
 
         byte[] result = new byte[1000];
         int ab = decompress.getAdler();
         int resultLength = decompress.inflate(result);  
         xmlout.write(result, 0, resultLength);
 
} while (!decompress.finished());
 
int finalsize = (int)decompress.getBytesWritten();

//得到解壓縮后的字串:<?xml version="1.0" encoding="UTF-16" ?><Adobe_Root><Adobe_Title><Version>20。。。。。</Adobe_Root>
String finalStr = new String(xmlout.toByteArray(),0,finalsize, "unicode");

//再次執行壓縮操作
byte[] input = finalStr.getBytes("unicode");

byte[] input_result = new byte[100000];
Deflater compresser = new Deflater();

//compresser.setInput(input);
compresser.setInput(input, 0, input.length);
compresser.finish();

  
//得到壓縮的字串長度:3140,比未解壓縮之前少了32位元組
int compressedDataLength = compresser.deflate(input_result);  
            byte[] contentByte = new byte[compressedDataLength];  
            
            System.arraycopy(output, 0, contentByte, 0, compressedDataLength);  
            
            String s2 = new String(contentByte);
            

//編碼
Base64.Encoder encoder = Base64.getEncoder();

byte[] result2 = encoder.encode(contentByte);
String a = new String(contentByte);
System.out.println(a.length());

System.out.println(new String(result2));
System.out.println(new String(result2));

//new String(xmlout.toByteArray(),0,)
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}

}
}



uj5u.com熱心網友回復:

上面有誤,

setInput(output, 0, compressedDataLength);

compressedDataLength是壓縮前的源檔案長度,你壓縮前的源檔案長度未知,所以獲取的長度可能和源檔案長度不一致。

uj5u.com熱心網友回復:

參考 5 樓 qq_39936465 的回復:
上面有誤,

setInput(output, 0, compressedDataLength);

compressedDataLength是壓縮前的源檔案長度,你壓縮前的源檔案長度未知,所以獲取的長度可能和源檔案長度不一致。



int finalsize = (int)decompress.getBytesWritten(); //這是壓縮前的源檔案長度


經過除錯我發現代碼中一處參考錯誤:

System.arraycopy(output, 0, contentByte, 0, compressedDataLength);


應該改成
System.arraycopy(input_result, 0, contentByte, 0, compressedDataLength);


uj5u.com熱心網友回復:

有一處很不理解,第30行代碼,為什么會設定32 bit的偏移:
decompress.setInput(output, 32, output_length-32);


如果在解壓縮的時候設定了偏移,我覺得在重新壓縮的時候,同樣需要設定,但我嘗試設定該值,得到的都是錯誤結果。

uj5u.com熱心網友回復:

參考
int finalsize = (int)decompress.getBytesWritten(); //這是壓縮前的源檔案長度
經過除錯我發現代碼中一處參考錯誤:
System.arraycopy(output, 0, contentByte, 0, compressedDataLength);

應該改成
System.arraycopy(input_result, 0, contentByte, 0, compressedDataLength);


inflate 原始碼
inflate(byte[] b, int off, int len)

你程式里
decompress.setInput(output, 32, output_length-32);
設定了偏移量為32,長度也減少32。那么你前后2段長度肯定也會相差32.

uj5u.com熱心網友回復:

decompress.setInput(output, 32, output_length-32);

這一行代碼來源于這里的最后一篇回復:
https://community.adobe.com/t5/premiere-pro/how-to-export-a-legacy-title-in-new-premiere-pro-cc-update/td-p/9057131

不知道為何要加32byte的偏移,但我嘗試不加偏移,但在執行解壓縮的時候,執行到這一行代碼
int resultLength = decompress.inflate(result);


就會報如下錯誤:

java.util.zip.DataFormatException: incorrect header check
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Unknown Source)
at java.util.zip.Inflater.inflate(Unknown Source)
at test.Test2.main(Test2.java:39)

uj5u.com熱心網友回復:

參考 9 樓 fengda2870 的回復:
decompress.setInput(output, 32, output_length-32);

這一行代碼來源于這里的最后一篇回復:
https://community.adobe.com/t5/premiere-pro/how-to-export-a-legacy-title-in-new-premiere-pro-cc-update/td-p/9057131

不知道為何要加32byte的偏移,但我嘗試不加偏移,但在執行解壓縮的時候,執行到這一行代碼
int resultLength = decompress.inflate(result);


就會報如下錯誤:

java.util.zip.DataFormatException: incorrect header check
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Unknown Source)
at java.util.zip.Inflater.inflate(Unknown Source)
at test.Test2.main(Test2.java:39)



確實如果不加32會報錯,但是api原始碼實體是不用加32的,應該跟之前壓縮有關系,下面的api的案例代碼。
所以你的代碼確實可以解壓該字串,但是你再次壓縮時沒有包含這32位元組,所以肯定會少。


 try {
     // Encode a String into bytes
     String inputString = "blahblahblah??";
     byte[] input = inputString.getBytes("UTF-8");

     // Compress the bytes
     byte[] output = new byte[100];
     Deflater compresser = new Deflater();
     compresser.setInput(input);
     compresser.finish();
     int compressedDataLength = compresser.deflate(output);

     // Decompress the bytes
     Inflater decompresser = new Inflater();
     decompresser.setInput(output, 0, compressedDataLength);
     byte[] result = new byte[100];
     int resultLength = decompresser.inflate(result);
     decompresser.end();

     // Decode the bytes into a String
     String outputString = new String(result, 0, resultLength, "UTF-8");
 } catch(java.io.UnsupportedEncodingException ex) {
     // handle
 } catch (java.util.zip.DataFormatException ex) {
     // handle
 }

uj5u.com熱心網友回復:

參考 10 樓 qq_39936465 的回復:

這是PR檔案中要決議的字串來源,屬性中顯示是Encoding是base64
另外還有一個BinaryHash屬性,這是做什么用的?去除-號,它是一個32位的字串,不知道有什么用
<ImporterPrefs Encoding="base64" BinaryHash="e0e26420-8a70-fce7-7ca9-ea5d00000c6e">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
</ImporterPrefs>

uj5u.com熱心網友回復:

參考 11 樓 fengda2870 的回復:
Quote: 參考 10 樓 qq_39936465 的回復:

這是PR檔案中要決議的字串來源,屬性中顯示是Encoding是base64
另外還有一個BinaryHash屬性,這是做什么用的?去除-號,它是一個32位的字串,不知道有什么用


binaryhash 應該是二值哈希編碼,應該是檢索圖片檔案用的,被追加在base64編碼之前了。

uj5u.com熱心網友回復:

樓主,你的代碼的第30行,為啥要舍棄32個位元組?
然后,在60行的注釋里面說,少了32個位元組,是因為沒有看到第30行舍棄了32個位元組吧?
位元組數應該是不會有差異的,并且,每個位元組里面的資料也是要一一對應相等的。

uj5u.com熱心網友回復:

參考 13 樓 冰思雨 的回復:
樓主,你的代碼的第30行,為啥要舍棄32個位元組?
然后,在60行的注釋里面說,少了32個位元組,是因為沒有看到第30行舍棄了32個位元組吧?
位元組數應該是不會有差異的,并且,每個位元組里面的資料也是要一一對應相等的。

這是別人寫的代碼,偏移了32個位元組,我嘗試過不進行偏移,但在進行解壓縮的時候會報錯:
java.util.zip.DataFormatException: incorrect header check

uj5u.com熱心網友回復:

參考 14 樓 fengda2870 的回復:
Quote: 參考 13 樓 冰思雨 的回復:
樓主,你的代碼的第30行,為啥要舍棄32個位元組?
然后,在60行的注釋里面說,少了32個位元組,是因為沒有看到第30行舍棄了32個位元組吧?
位元組數應該是不會有差異的,并且,每個位元組里面的資料也是要一一對應相等的。

這是別人寫的代碼,偏移了32個位元組,我嘗試過不進行偏移,但在進行解壓縮的時候會報錯:
java.util.zip.DataFormatException: incorrect header check


這32個字符是圖片引索用的,字串可能是圖片的壓縮碼,所以正常內容就是33位元組開始的內容,但是你壓縮的時候沒有添加上去,自然少32字符。

uj5u.com熱心網友回復:

參考 15 樓 qq_39936465 的回復:
Quote: 參考 14 樓 fengda2870 的回復:
Quote: 參考 13 樓 冰思雨 的回復:
樓主,你的代碼的第30行,為啥要舍棄32個位元組?
然后,在60行的注釋里面說,少了32個位元組,是因為沒有看到第30行舍棄了32個位元組吧?
位元組數應該是不會有差異的,并且,每個位元組里面的資料也是要一一對應相等的。

這是別人寫的代碼,偏移了32個位元組,我嘗試過不進行偏移,但在進行解壓縮的時候會報錯:
java.util.zip.DataFormatException: incorrect header check


這32個字符是圖片引索用的,字串可能是圖片的壓縮碼,所以正常內容就是33位元組開始的內容,但是你壓縮的時候沒有添加上去,自然少32字符。


那32個字符是BinaryHash嗎?e0e26420-8a70-fce7-7ca9-ea5d00000c6e

怎么把它添加進去?是把它轉字byte陣列,添加到壓縮后的byte陣列前嗎?

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/34329.html

標籤:Web 開發

上一篇:bean創建失敗原因?

下一篇:Intellij除錯TomcatWindowsService報錯

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more