2014-03-26 39 views
-2

我有一个int数组,我通过使用RobotPeer.getRGBPixels()获得。我将其转换为字节数组通过套接字发送使用:Java - 转换字节[]为int [] rgb

public static byte[] toByteArray(int[] ints){ 
    byte[] bytes = new byte[ints.length * 4]; 
      for (int i = 0; i < ints.length; i++) { 
     bytes[i * 4] = (byte) (ints[i] & 0xFF); 
     bytes[i * 4 + 1] = (byte) ((ints[i] & 0xFF00) >> 8); 
     bytes[i * 4 + 2] = (byte) ((ints[i] & 0xFF0000) >> 16); 
     bytes[i * 4 + 3] = (byte) ((ints[i] & 0xFF000000) >> 24); 
    } 
    return bytes; 
} 

问题是: 我用这个方法:

public static int[] toIntArray(byte buf[]) { 
    int intArr[] = new int[buf.length/4]; 
    int offset = 0; 
    for (int i = 0; i < intArr.length; i++) { 
     intArr[i] = (buf[3 + offset] & 0xFF) | ((buf[2 + offset] & 0xFF) << 8) 
       | ((buf[1 + offset] & 0xFF) << 16) | ((buf[0 + offset] & 0xFF) << 24); 
     offset += 4; 
    } 
    return intArr; 
} 

找回int数组。然后我从它创建BufferedImage,我得到: https://www.dropbox.com/s/p754u3tnivigu70/test.jpeg

请帮我解决这个问题。

+0

你有错误的字节顺序。可能的重复[在Java中的字节数组和整数转换](http://stackoverflow.com/questions/5399798/byte-array-and-int-conversion-in-java) –

+0

使用'ByteBuffer's;他们将为您处理位处理,并且您可以指定使用的字节顺序 – fge

+0

@BrianRoach谢谢,我解决了它。对不起,创建重复的问题,下次我会试图找出答案。 –

回答

2

不要担心移位等问题; Java有ByteBuffer它可以处理,对你,对字节顺序开机:

public static int[] toIntArray(byte buf[]) 
{ 
    final ByteBuffer buffer = ByteBuffer.wrap(buf) 
     .order(ByteOrder.LITTLE_ENDIAN); 
    final int[] ret = new int[buf.length/4]; 
    buffer.asIntBuffer().put(ret); 
    return ret; 
} 

类似的,反转:

public static byte[] toByteArray(int[] ints) 
{ 
    final ByteBuffer buf = ByteBuffer.allocate(ints.length * 4) 
     .order(ByteOrder.LITTLE_ENDIAN); 
    buf.asIntBuffer().put(ints); 
    return buf.array(); 
} 

不要忘记你的情况来指定字节顺序,因为ByteBuffer s为大端默认。

+0

感谢支持,但您的toIntArray方法抛出java.lang.UnsupportedOperationException。 –

+0

请参阅编辑;现在它工作 – fge