Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从小尾端4字节int到java int的非gzip解码的字符串base64_Java_Gzip_Base64_Endianness_Tmx - Fatal编程技术网

从小尾端4字节int到java int的非gzip解码的字符串base64

从小尾端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

我正在尝试在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 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-谢谢,并已修复。这看起来仍然不正确-压缩字节数组中的字节数与整数数没有任何关系。请参阅我关于如何读取流的更新答案。