从小尾端4字节int到java int的非gzip解码的字符串base64
我正在尝试在Android中实现TMX文件,我希望有人能帮助我。基于,为了得到GID,我必须 首先base64解码字符串,然后在压缩属性设置为“gzip”时压缩结果数据,如上例所示。最后,从数据流的开始到结束,您可以一次读取每个GID的4个字节 我想我已经找到了base64解码和“gunzip”,但是下面代码的结果是27,0,0,0重复。我认为输出应该是 (0,0)(1,0)(2,0)(3,0)(0,1)(1,1)(2,1)(3,1)(0,2)(1,2)(2,2)(3,2) 谢谢从小尾端4字节int到java int的非gzip解码的字符串base64,java,gzip,base64,endianness,tmx,Java,Gzip,Base64,Endianness,Tmx,我正在尝试在Android中实现TMX文件,我希望有人能帮助我。基于,为了得到GID,我必须 首先base64解码字符串,然后在压缩属性设置为“gzip”时压缩结果数据,如上例所示。最后,从数据流的开始到结束,您可以一次读取每个GID的4个字节 我想我已经找到了base64解码和“gunzip”,但是下面代码的结果是27,0,0,0重复。我认为输出应该是 (0,0)(1,0)(2,0)(3,0)(0,1)(1,1)(2,1)(3,1)(0,2)(1,2)(2,2)(3,2) 谢谢 public
public static void main( String[] args )
{
String myString = "H4sIAAAAAAAAAO3NoREAMAgEsLedAfafE4+s6l0jolNJiif18tt/Fj8AAMC9ARtYg28AEAAA";
byte[] decode = Base64.decodeBase64(myString);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(decode);
GZIPInputStream gzipInputStream;
int read;
try
{
gzipInputStream = new GZIPInputStream(byteArrayInputStream);
InputStreamReader inputStreamReader = new InputStreamReader(gzipInputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader, 4);
while ( ( read = bufferedReader.read() ) != -1 )
{
System.out.println("read :" + read);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
除了字符数据外,不要使用Reader
s
使用DataInput
读取整数。用一个新的图标装饰您的gzip输入流
,并使用它
如果int是little-endian,则需要反转类型的字节顺序。Java使用网络字节顺序(big-endian)。对于整数,可以使用
您可以使用以下方式打印十六进制值:
System.out.format("%08x", (int) n);
如何从任意长度的流中读取所有
int
值:
一种机制是使用估计剩余字节数的available()
方法:
byte[] ints = {0x00, 0x00, 0x00, (byte) 0xFF,
(byte) 0xAA, (byte) 0xBB, (byte) 0xEE, (byte) 0xFF};
ByteArrayInputStream array = new ByteArrayInputStream(ints);
DataInputStream data = new DataInputStream(array);
while(data.available() > 0) {
int reversed = Integer.reverseBytes(data.readInt());
System.out.format("%08x%n", reversed);
}
在一般情况下,available()
不是可靠的机制。但您可以使用缓冲区来增加流,以检查数据可用性:
public static void main(String[] args) throws IOException {
byte[] ints = {0x00, 0x00, 0x00, (byte) 0xFF,
(byte) 0xAA, (byte) 0xBB, (byte) 0xEE, (byte) 0xFF};
ByteArrayInputStream array = new ByteArrayInputStream(ints);
BufferedInputStream buffer = new BufferedInputStream(array);
DataInputStream data = new DataInputStream(buffer);
while(hasData(data)) {
int reversed = Integer.reverseBytes(data.readInt());
System.out.format("%08x%n", reversed);
}
}
public static boolean hasData(InputStream in) throws IOException {
in.mark(1);
try {
return in.read() != -1;
} finally {
in.reset();
}
}
除了字符数据外,不要使用Reader
s
使用DataInput
读取整数。用一个新的图标装饰您的gzip输入流
,并使用它
如果int是little-endian,则需要反转类型的字节顺序。Java使用网络字节顺序(big-endian)。对于整数,可以使用
您可以使用以下方式打印十六进制值:
System.out.format("%08x", (int) n);
如何从任意长度的流中读取所有
int
值:
一种机制是使用估计剩余字节数的available()
方法:
byte[] ints = {0x00, 0x00, 0x00, (byte) 0xFF,
(byte) 0xAA, (byte) 0xBB, (byte) 0xEE, (byte) 0xFF};
ByteArrayInputStream array = new ByteArrayInputStream(ints);
DataInputStream data = new DataInputStream(array);
while(data.available() > 0) {
int reversed = Integer.reverseBytes(data.readInt());
System.out.format("%08x%n", reversed);
}
在一般情况下,available()
不是可靠的机制。但您可以使用缓冲区来增加流,以检查数据可用性:
public static void main(String[] args) throws IOException {
byte[] ints = {0x00, 0x00, 0x00, (byte) 0xFF,
(byte) 0xAA, (byte) 0xBB, (byte) 0xEE, (byte) 0xFF};
ByteArrayInputStream array = new ByteArrayInputStream(ints);
BufferedInputStream buffer = new BufferedInputStream(array);
DataInputStream data = new DataInputStream(buffer);
while(hasData(data)) {
int reversed = Integer.reverseBytes(data.readInt());
System.out.format("%08x%n", reversed);
}
}
public static boolean hasData(InputStream in) throws IOException {
in.mark(1);
try {
return in.read() != -1;
} finally {
in.reset();
}
}
publicstaticvoidmain(字符串[]args)
{
字符串myString="目前,中国有一个AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV1PGPBWTW1/a5vDn1WTW1f4ptDn1Vd+5KUyF1IKDXVS1LMOQTI7WEAAAAAAAF37ALFWZCEQJWAA”;
字节[]decode=Base64.decodeBase64(myString);
ByteArrayInputStream ByteArrayInputStream=新的ByteArrayInputStream(解码);
int-read;
尝试
{
gzip输入流gzip输入流=新的gzip输入流(byteArrayInputStream);
DataInputStream DataInputStream=新的DataInputStream(gzipInputStream);
for(int i=0;i
公共静态void main(字符串[]args)
{
字符串myString=”目前,中国有一个AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV1PGPBWTW1/a5vDn1WTW1f4ptDn1Vd+5KUyF1IKDXVS1LMOQTI7WEAAAAAAAF37ALFWZCEQJWAA”;
字节[]decode=Base64.decodeBase64(myString);
ByteArrayInputStream ByteArrayInputStream=新的ByteArrayInputStream(解码);
int-read;
尝试
{
gzip输入流gzip输入流=新的gzip输入流(byteArrayInputStream);
DataInputStream DataInputStream=新的DataInputStream(gzipInputStream);
for(int i=0;i
@Erik-问题答案的顺序在StackOverflow上是不固定的,因此“下面”不是一个有意义的参考。@Erik-问题答案的顺序在StackOverflow上是不固定的,所以“下面”“不是有意义的引用。@McDowell-谢谢,已修复。这看起来仍然不正确-压缩字节数组中的字节数与整数数没有任何关系。”。请参阅我关于如何从流中读取的更新答案。@McDowell-谢谢,并已修复。这看起来仍然不正确-压缩字节数组中的字节数与整数数没有任何关系。请参阅我关于如何读取流的更新答案。