如何将int 转换为byte

我有一个代表RGB图像的整数数组,并希望将其转换为字节数组并将其保存到文件中。

在Java中将整数数组转换为字节数组的最佳方法是什么?

正如Brian所说,你需要弄清楚你需要怎样的转换。

你想保存为“正常”的图像文件(JPG,PNG等)?

如果是这样,你应该使用Java Image I / O API。

如果要将其保存为“原始”格式,则必须指定写入字节的顺序,然后使用IntBuffer和NIO。

作为使用ByteBuffer / IntBuffer组合的一个例子:

 import java.nio.*; import java.net.*; class Test { public static void main(String [] args) throws Exception // Just for simplicity! { int[] data = { 100, 200, 300, 400 }; ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 4); IntBuffer intBuffer = byteBuffer.asIntBuffer(); intBuffer.put(data); byte[] array = byteBuffer.array(); for (int i=0; i < array.length; i++) { System.out.println(i + ": " + array[i]); } } } 

也许使用这种方法

 byte[] integersToBytes(int[] values) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); for(int i=0; i < values.length; ++i) { dos.writeInt(values[i]); } return baos.toByteArray(); } 

您需要决定如何将1个整数转换为一组字节。

最可能的是(?)1个整数到4个字节,并使用shift( >><< )操作符来获取每个字节(注意字节顺序! 复制到整数数组长度的4倍的字节数组。

如果你的意图是保存到文件,你可能想要使用FileOutputStream.write直接保存在一个文件中:

  OutputStream os = new FileOutputStream("aa"); int[] rgb = { 0xff, 0xff, 0xff }; for (int c : rgb) { os.write(c); } os.close(); 

因为它:

将指定的字节写入此输出stream。 写入的一般契约是将一个字节写入输出stream。 要写入的字节是参数b的八个低位。 b的24位高位被忽略。

我创build了这个代码,它工作得很好:

  int IntToByte(byte arrayDst[], int arrayOrg[], int maxOrg){ int i; int idxDst; int maxDst; // maxDst = maxOrg*4; // if (arrayDst==null) return 0; if (arrayOrg==null) return 0; if (arrayDst.length < maxDst) return 0; if (arrayOrg.length < maxOrg) return 0; // idxDst = 0; for (i=0; i<maxOrg; i++){ // Copia o int, byte a byte. arrayDst[idxDst] = (byte)(arrayOrg[i]); idxDst++; arrayDst[idxDst] = (byte)(arrayOrg[i] >> 8); idxDst++; arrayDst[idxDst] = (byte)(arrayOrg[i] >> 16); idxDst++; arrayDst[idxDst] = (byte)(arrayOrg[i] >> 24); idxDst++; } // return idxDst; } int ByteToInt(int arrayDst[], byte arrayOrg[], int maxOrg){ int i; int v; int idxOrg; int maxDst; // maxDst = maxOrg/4; // if (arrayDst==null) return 0; if (arrayOrg==null) return 0; if (arrayDst.length < maxDst) return 0; if (arrayOrg.length < maxOrg) return 0; // idxOrg = 0; for (i=0; i<maxDst; i++){ arrayDst[i] = 0; // v = 0x000000FF & arrayOrg[idxOrg]; arrayDst[i] = arrayDst[i] | v; idxOrg++; // v = 0x000000FF & arrayOrg[idxOrg]; arrayDst[i] = arrayDst[i] | (v << 8); idxOrg++; // v = 0x000000FF & arrayOrg[idxOrg]; arrayDst[i] = arrayDst[i] | (v << 16); idxOrg++; // v = 0x000000FF & arrayOrg[idxOrg]; arrayDst[i] = arrayDst[i] | (v << 24); idxOrg++; } // return maxDst; } 

我会使用“DataOutputStream”与“ByteArrayOutputStream”。

 public final class Converter { private static final int BYTES_IN_INT = 4; private Converter() {} public static byte [] convert(int [] array) { if (isEmpty(array)) { return new byte[0]; } return writeInts(array); } public static int [] convert(byte [] array) { if (isEmpty(array)) { return new int[0]; } return readInts(array); } private static byte [] writeInts(int [] array) { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(array.length * 4); DataOutputStream dos = new DataOutputStream(bos); for (int i = 0; i < array.length; i++) { dos.writeInt(array[i]); } return bos.toByteArray(); } catch (IOException e) { throw new RuntimeException(e); } } private static int [] readInts(byte [] array) { try { ByteArrayInputStream bis = new ByteArrayInputStream(array); DataInputStream dataInputStream = new DataInputStream(bis); int size = array.length / BYTES_IN_INT; int[] res = new int[size]; for (int i = 0; i < size; i++) { res[i] = dataInputStream.readInt(); } return res; } catch (IOException e) { throw new RuntimeException(e); } } } public class ConverterTest { @Test public void convert() { final int [] array = {-1000000, 24000, -1, 40}; byte [] bytes = Converter.convert(array); int [] array2 = Converter.convert(bytes); assertTrue(ArrayUtils.equals(array, array2)); System.out.println(Arrays.toString(array)); System.out.println(Arrays.toString(bytes)); System.out.println(Arrays.toString(array2)); } } 

打印:

 [-1000000, 24000, -1, 40] [-1, -16, -67, -64, 0, 0, 93, -64, -1, -1, -1, -1, 0, 0, 0, 40] [-1000000, 24000, -1, 40]