C # إلى جافا:Base64String، MemoryStream، GZipStream
-
05-07-2019 - |
سؤال
لدي سلسلة Base64 تم ضغطها بواسطة gzipp في .NET وأرغب في تحويلها مرة أخرى إلى سلسلة في Java.أنا أبحث عن بعض مرادفات Java لبناء جملة C#، على وجه الخصوص:
- تحويل. من Base64String
- دفق الذاكرة
- GZipStream
إليك الطريقة التي أرغب في تحويلها:
public static string Decompress(string zipText) {
byte[] gzipBuff = Convert.FromBase64String(zipText);
using (MemoryStream memstream = new MemoryStream())
{
int msgLength = BitConverter.ToInt32(gzipBuff, 0);
memstream.Write(gzipBuff, 4, gzipBuff.Length - 4);
byte[] buffer = new byte[msgLength];
memstream.Position = 0;
using (GZipStream gzip = new GZipStream(memstream, CompressionMode.Decompress))
{
gzip.Read(buffer, 0, buffer.Length);
}
return Encoding.UTF8.GetString(buffer);
}
}
هي موضع تقدير أي مؤشرات.
المحلول
بالنسبة لـ Base64، لديك Base64
فصل من أباتشي كومنز، و decodeBase64
الطريقة التي تأخذ أ String
ويعود أ byte[]
.
ومن ثم يمكنك قراءة النتيجة byte[]
الى ByteArrayInputStream
.وأخيرا، تمرير ByteArrayInputStream
إلى أ GZipInputStream وقراءة البايتات غير المضغوطة.
يبدو الرمز وكأنه شيء على هذا المنوال:
public static String Decompress(String zipText) throws IOException {
byte[] gzipBuff = Base64.decodeBase64(zipText);
ByteArrayInputStream memstream = new ByteArrayInputStream(gzipBuff);
GZIPInputStream gzin = new GZIPInputStream(memstream);
final int buffSize = 8192;
byte[] tempBuffer = new byte[buffSize ];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((size = gzin.read(tempBuffer, 0, buffSize)) != -1) {
baos.write(tempBuffer, 0, size);
}
byte[] buffer = baos.toByteArray();
baos.close();
return new String(buffer, "UTF-8");
}
لم أختبر الكود، ولكن أعتقد أنه يجب أن يعمل، ربما مع بعض التعديلات.
نصائح أخرى
بالنسبة لـ Base64 أنصحك به تنفيذ iHolder.
GZipinputStream هو ما تحتاجه لفك ضغط مجموعة بايت GZip.
ByteArrayOutputStream هو ما تستخدمه لكتابة البايتات إلى الذاكرة.يمكنك بعد ذلك الحصول على البايتات وتمريرها إلى منشئ كائن السلسلة لتحويلها، ويفضل تحديد التشفير.