不同的结果ByteArrayOutputStream Java和C#



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

我尝试在C#上使用ByteArrayOutputStream。

我有一串数据:

EFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz01234567896EFGHIjkLMNOPQrstUVWXYZab cdefghizklmnopqtstuvxyz 01234567896

对于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+IjEpMSk5JTUvPyMzKzsnNyy8oLCouKS0r6isMjA0MjYxNTO3sDRzpEw7AHuTKoM=

对于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/rt/ndT8vAEIwgmI4QWI/+wd7kyqD

为什么会发生这种情况,我该如何解决问题

没有问题。

这两个结果都是有效的zlib流,带有一个检出的校验值,并且都解压缩到完全相同的东西。

无法保证两个不同的压缩机将在相同的输入下产生相同的输出。唯一的保证是,当你解压缩时,你会得到和刚开始一样的东西。你是。

我确实觉得有点奇怪的是,C#代码正在生成一个动态块,而结果可以比固定块短四个字节。我怀疑您使用的是旧得多的版本。NET使用了一个写得不好的压缩器(在微软内部)。它现在使用zlib,不会犯那个错误。然而,我强调,结果仍然是完全有效和可用的。

相关内容

  • 没有找到相关文章

最新更新