在Java中解压缩字节数组
我的问题是关于C#和Java的 我想从这个链接中解压缩一个字节数组,类似于C#decompress的方法: 我用Java翻译了这个方法:在Java中解压缩字节数组,java,c#,arrays,Java,C#,Arrays,我的问题是关于C#和Java的 我想从这个链接中解压缩一个字节数组,类似于C#decompress的方法: 我用Java翻译了这个方法: public static byte[] Decompress(byte[] data) { try { Byte[] r = null; try (InputStream ms = new ByteArrayInputStream(data); InflaterInputStream s = new
public static byte[] Decompress(byte[] data)
{
try {
Byte[] r = null;
try (InputStream ms = new ByteArrayInputStream(data);
InflaterInputStream s = new InflaterInputStream(ms)
) {
List<Byte> list = new ArrayList<Byte>();
int count = 0;
byte[] b = new byte[8192];
while ((count = s.read(b, 0, 8192)) > 0) {
for (byte by : Arrays.copyOfRange(b,0,count+1)) {
list.add(by);
}
}
r = list.toArray(r);
list.clear();
list = null;
}
byte[] bytes = new byte[r.length];
int j=0;
// Unboxing Byte values. (Byte[] to byte[])
for(Byte b: r)
bytes[j++] = b.byteValue();
return bytes;
}
catch (Exception e){
System.out.println(e.toString());
}
return new byte[] {};
}
在爪哇
public static void main(String[] args)
{
String encodedString = "arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO";
encodedString = encodedString.substring(8);
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedByteArray = decoder.decode(encodedString);
decodedByteArray = d67(decodedByteArray, 28435);
decodedByteArray = Zip.Decompress(decodedByteArray);
System.out.print(hexlify(decodedByteArray));
}
private static byte[] d67(byte[] data, int b) {
byte[] buffer = new byte[data.length];
System.arraycopy(data, 0, buffer, 0, data.length);
for (int i = 0; i < data.length; i++) {
int unsignedData = unsignedToBytes(data[i]);
buffer[i] = (byte) (unsignedData ^ b >> 8 & 255);
b = (b + unsignedData) * 23219 + 36126 & 65535;
}
return buffer;
}
public static int unsignedToBytes(byte b) {
return b & 0xFF;
}
public static String hexlify(byte[] data) {
StringBuilder b = new StringBuilder();
for (int i = 0; i < data.length; i++) {
b.append(String.format("%02X", data[i]));
if (i < data.length - 1) {
b.append("-");
}
}
return b.toString();
}
publicstaticvoidmain(字符串[]args)
{
字符串编码字符串=”arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO”;
encodedString=encodedString.substring(8);
Base64.Decoder Decoder=Base64.getDecoder();
字节[]decodedByteArray=解码器.decode(encodedString);
decodedByteArray=d67(decodedByteArray,28435);
decodedByteArray=Zip.解压缩(decodedByteArray);
系统输出打印(hexlify(decodedByteArray));
}
专用静态字节[]d67(字节[]数据,int b){
byte[]buffer=新字节[data.length];
数组复制(数据,0,缓冲区,0,数据长度);
对于(int i=0;i>8&255);
b=(b+无符号数据)*23219+36126和65535;
}
返回缓冲区;
}
公共静态整型无符号字节(字节b){
返回b&0xFF;
}
公共静态字符串十六进制(字节[]数据){
StringBuilder b=新的StringBuilder();
对于(int i=0;i
我有个例外
java.lang.NullPointerException:尝试获取空数组的长度
但是没有像C#那样的输出
我翻译错了什么?我也不明白为什么会出现这种例外:(…您的解压缩方法乱七八糟,根本不起作用。它试图做的只是返回充气器流的完整输出。Java有一个内置的方法来执行此操作,可以替换整个过程。当您这样做时,您会得到完全相同的输出。下面是完整的程序,可以编译和运行:
import java.util.Base64;
import java.util.zip.InflaterInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
class Example {
public static void main(String[] args) throws Exception {
String encodedString = "arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO";
encodedString = encodedString.substring(8);
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedByteArray = decoder.decode(encodedString);
decodedByteArray = d67(decodedByteArray, 28435);
decodedByteArray = decompress(decodedByteArray);
System.out.print(hexlify(decodedByteArray));
}
private static byte[] d67(byte[] data, int b) {
byte[] buffer = new byte[data.length];
System.arraycopy(data, 0, buffer, 0, data.length);
for (int i = 0; i < data.length; i++) {
int unsignedData = unsignedToBytes(data[i]);
buffer[i] = (byte) (unsignedData ^ b >> 8 & 255);
b = (b + unsignedData) * 23219 + 36126 & 65535;
}
return buffer;
}
public static int unsignedToBytes(byte b) {
return b & 0xFF;
}
public static String hexlify(byte[] data) {
StringBuilder b = new StringBuilder();
for (int i = 0; i < data.length; i++) {
b.append(String.format("%02X", data[i]));
if (i < data.length - 1) {
b.append("-");
}
}
return b.toString();
}
public static byte[] decompress(byte[] data) throws IOException {
try (InputStream ms = new ByteArrayInputStream(data);
InflaterInputStream s = new InflaterInputStream(ms)) {
return s.readAllBytes();
}
}
}
import java.util.Base64;
导入java.util.zip.InflateInputStream;
导入java.io.ByteArrayInputStream;
导入java.io.IOException;
导入java.io.InputStream;
课例{
公共静态void main(字符串[]args)引发异常{
字符串编码字符串=”arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO”;
encodedString=encodedString.substring(8);
Base64.Decoder Decoder=Base64.getDecoder();
字节[]decodedByteArray=解码器.decode(encodedString);
decodedByteArray=d67(decodedByteArray,28435);
decodedByteArray=解压缩(decodedByteArray);
系统输出打印(hexlify(decodedByteArray));
}
专用静态字节[]d67(字节[]数据,int b){
byte[]buffer=新字节[data.length];
数组复制(数据,0,缓冲区,0,数据长度);
对于(int i=0;i>8&255);
b=(b+无符号数据)*23219+36126和65535;
}
返回缓冲区;
}
公共静态整型无符号字节(字节b){
返回b&0xFF;
}
公共静态字符串十六进制(字节[]数据){
StringBuilder b=新的StringBuilder();
对于(int i=0;i
除了decompress方法,我没有做任何更改,现在几乎不包含任何代码。我假设这是一行:
r=list.toArray(r);
Java文档状态:在Java中不使用相同的字符串。您好rzwitserloot,非常感谢您的帮助。调用readAllBytes()是否需要高于7的Java版本方法?我只有Java 7可用。编译器向我抛出错误:"“java.util.zip.InflaterInputStream”的未知方法“readAllBytes”。我想尝试调用具有java 7的方法。也许我可以……是的。java 7不再受支持,可能存在安全漏洞;升级它。我使用AIDE,因此我无法升级java。但如果我查看InflaterInputStream类,我找不到readAllB方法ytes()…我不知道AIDE是什么,但Java7不受支持-如果JRE或JDK存在安全问题,没有人会更新它。你必须离开它;如果AIDE强制执行它,那么也是时候停止使用它了。你可以搜索readAllBytes()的功能。这有点复杂,而且涉及循环。还有番石榴(一个库),它仍然运行在java7上,并且有一个方法:ByteStreams.toByteArray(input),您可以使用它:Hello rzwitserloot,我想我不能为Java控制台项目导入外部库。如果不使用库,就无法翻译我展示的C代码吗?我非常感谢您。。。
public static void main(String[] args)
{
String encodedString = "arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO";
encodedString = encodedString.substring(8);
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedByteArray = decoder.decode(encodedString);
decodedByteArray = d67(decodedByteArray, 28435);
decodedByteArray = Zip.Decompress(decodedByteArray);
System.out.print(hexlify(decodedByteArray));
}
private static byte[] d67(byte[] data, int b) {
byte[] buffer = new byte[data.length];
System.arraycopy(data, 0, buffer, 0, data.length);
for (int i = 0; i < data.length; i++) {
int unsignedData = unsignedToBytes(data[i]);
buffer[i] = (byte) (unsignedData ^ b >> 8 & 255);
b = (b + unsignedData) * 23219 + 36126 & 65535;
}
return buffer;
}
public static int unsignedToBytes(byte b) {
return b & 0xFF;
}
public static String hexlify(byte[] data) {
StringBuilder b = new StringBuilder();
for (int i = 0; i < data.length; i++) {
b.append(String.format("%02X", data[i]));
if (i < data.length - 1) {
b.append("-");
}
}
return b.toString();
}
import java.util.Base64;
import java.util.zip.InflaterInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
class Example {
public static void main(String[] args) throws Exception {
String encodedString = "arlnk://F5fPxdTq8eJeuqSVejGmq7aTh6BJZ8J0jgt92MDDjxTIWf+mWa8Ld+01L2bVIV6FXhCO";
encodedString = encodedString.substring(8);
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedByteArray = decoder.decode(encodedString);
decodedByteArray = d67(decodedByteArray, 28435);
decodedByteArray = decompress(decodedByteArray);
System.out.print(hexlify(decodedByteArray));
}
private static byte[] d67(byte[] data, int b) {
byte[] buffer = new byte[data.length];
System.arraycopy(data, 0, buffer, 0, data.length);
for (int i = 0; i < data.length; i++) {
int unsignedData = unsignedToBytes(data[i]);
buffer[i] = (byte) (unsignedData ^ b >> 8 & 255);
b = (b + unsignedData) * 23219 + 36126 & 65535;
}
return buffer;
}
public static int unsignedToBytes(byte b) {
return b & 0xFF;
}
public static String hexlify(byte[] data) {
StringBuilder b = new StringBuilder();
for (int i = 0; i < data.length; i++) {
b.append(String.format("%02X", data[i]));
if (i < data.length - 1) {
b.append("-");
}
}
return b.toString();
}
public static byte[] decompress(byte[] data) throws IOException {
try (InputStream ms = new ByteArrayInputStream(data);
InflaterInputStream s = new InflaterInputStream(ms)) {
return s.readAllBytes();
}
}
}