ByteArrayOutputStream Java 和 C# 的不同结果

问题描述 投票:0回答:1

更新: 有关编码的答案: 我到处都使用 UTF-8

我尝试在 C# 上使用 ByteArrayOutputStream。

我有一串数据:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567896ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567896

对于java我使用的方法:

String a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567896ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567896";
byte[] bArr = a.getBytes();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(bArr.length);
DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream);
deflaterOutputStream.write(bArr);
deflaterOutputStream.close();
bArr = byteArrayOutputStream.toByteArray();
System.out.println("out: "+Base64.getEncoder().encodeToString(bArr));

所以,结果我得到了字符串:

eJxzdHJ2cXVz9/D08vbx9fMPCAwKDgkNC4+IjEpMSk5JTUvPyMzKzsnNyy8oLCouKS0rr6isMjA0MjYxNTO3sDRzpEw7AHuTKoM=

对于 C#,我使用下一个代码:

string source = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567896ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567896";
byte[] bArr_source = Encoding.UTF8.GetBytes(source);
MemoryStream byteArrayOutputStream = new MemoryStream(bArr_source.Length);
DeflaterOutputStream dos = new DeflaterOutputStream(byteArrayOutputStream);
dos.Write(bArr_source, 0, bArr_source.Length);
dos.Finish();
dos.Close();
bArr_source = byteArrayOutputStream.ToArray();
Console.WriteLine(Convert.ToBase64String(bArr_source));

但是在 C# 中,我得到了一条不同行:

eJyly8MBgAAAAMCVMp7Zdr9su+kbovsfRTMsxwuiJCuqphumZTuu5wdhFCdplhdlVTdt1w/jNC/rth/ndT8vAEIwgmI4QWI/+wd7kyqD

为什么会发生这种情况以及如何解决这个问题?

java c# compression gzip bytearrayoutputstream
1个回答
1
投票

没问题

两个结果都是有效的 zlib 流,带有检查值,并且都解压缩为完全相同的东西。

无法保证两个不同的压缩机会使用相同的输入产生相同的输出。唯一的保证是,当您“解压缩”时,您会得到与开始时相同的东西。而你就是。 我确实觉得有点奇怪,C# 代码生成动态块,而固定块的结果可以短四个字节。我怀疑您使用的是更旧版本的 .NET,该版本使用的压缩器编写得很差(在 Microsoft 内部)。现在它使用 zlib,就不会犯这样的错误了。但我强调,结果仍然是完全有效和可用的。

© www.soinside.com 2019 - 2024. All rights reserved.