2013-02-20 30 views
1

这里我有一个字符串,我将这个字符串转换为long,并将此long值转换为字节。这个字节数组长度为6如何在java中将字节转换为long

final byte[] tagBytes = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN) 
      .putLong(Long.parseLong("02201156116")).array(); 
    System.arraycopy(tagBytes, 0, tag, 0, 6); 
    Log.d("TAG", "TAG in bytes "+Arrays.toString(tag)); 

在这里,我得到了这样的[52, 84, 49, -125, 0, 0]

现在我想在此字符串输出字节转换为像以前一样"02201156116"

所以在这里我要第1次输出字节在BIG_ENDIAN中,然后包装Bytes并从中获得较长的值。 但在这里,我觉得很奇怪,为什么它不是为

ByteBuffer.wrap(tempDateBytes).order(ByteOrder.BIG_ENDIAN).getLong() 

这和它的工作连续工作

ByteBuffer.wrap(tempDateBytes).order(ByteOrder.LITTLE_ENDIAN).getLong()这一点,通过我们的时候,我们将long转换成我们使用LITTLE_ENDIAN字节申请BIG_ENDIAN监守d方式。所以我认为我们必须在这里使用BIG_ENDIAN。但它不适用于BIG_ENDIAN,它的作品为LITTLE_ENDIAN。

此代码我用来[52, 84, 49, -125, 0, 0]转换为02201156116

long time,time1; 
    final byte[] tempDateBytes = new byte[8]; 
    System.arraycopy(tagBytes, 0, tempDateBytes, 0, 6); 
    time1 = ByteBuffer.wrap(tempDateBytes).order(ByteOrder.BIG_ENDIAN).getLong(); 
    time = ByteBuffer.wrap(tempDateBytes).order(ByteOrder.LITTLE_ENDIAN).getLong(); 
    Log.d("TAG", "Orignal TAG "+time); 
    Log.d("TAG", "BAD TAG "+time1); 
+4

我读的问题是否正确?你不是已经解决了你的问题吗? – jlordo 2013-02-20 12:05:55

+0

如果你只给它6个字节(因为'long'是8个字节),'ByteBuffer.getLong'不会抛出异常吗? – 2013-02-20 12:08:53

+1

@IanRoberts:'byte []'的大小为8.他只是复制6个字节,但这并不重要。 – jlordo 2013-02-20 12:12:49

回答

2

short方面想想吧。比方说,我们编码值258:

258 = 256 + 2 = 0x0102 

现在,如果我们把这个数组,我们必须决定我们能做到,我们把索引为0字节

{ 0x01, 0x02 } 

{ 0x02, 0x01 } 

没有顺序本身比其他顺序更好,但关键点是要记住我们使用的顺序,当我们想要解码数组并且想要返回值258时。

这是LITTLE_ENDIAN和BIG_ENDIAN的用途。在编码时,它会告诉要使用的字节顺序。在解码时,它会告诉我们在编码时使用的字节顺序。

因此,要不弄错事情,一定要在编码和解码时使用相同的字节顺序。

+0

雅我得到你的答案,并感谢给这个答案。 – 2013-02-20 13:01:43

+0

这里的编码意味着ByteBuffer.allocate()和解码意味着ByteBuffer.wrap()?我对吗? – 2013-02-20 13:03:58

+0

@Sam_k - 编码= putLong,解码= getLong。 – Ingo 2013-02-20 13:05:32

相关问题