Как преобразовать int[] в байт[]
У меня есть массив целых чисел, которые представляют изображение RGB и хотели бы преобразовать его в массив байтов и сохранить его в файл.
каков наилучший способ преобразования массива целых чисел в массив байтов в Java?
6 ответов:
Как Брайан говорит, вам нужно выяснить, как какой вид преобразования вам нужно.
вы хотите сохранить его как "нормальный" файл изображения (jpg, png и т. д.)?
Если это так, вы должны, вероятно, использовать Java Image I / O API.
Если вы хотите сохранить его в формате" raw", необходимо указать порядок записи байтов, а затем использовать
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 байт, и использовать сдвиг (
>>
или<<
) операторы, чтобы получить каждый байт (смотрите, что порядок байтов!). Скопируйте в массив байтов в 4 раза больше длины массива целых чисел.
Если вы хотите сохранить в файл, вы можете сохранить его непосредственно в файле с помощью FileOutputStream.напишите:
OutputStream os = new FileOutputStream("aa"); int[] rgb = { 0xff, 0xff, 0xff }; for (int c : rgb) { os.write(c); } os.close();
так:
пишет указанный байт в этот выходной поток. Общий контракт на запись заключается в том, что один байт записывается в выходной поток. Записываемый байт - это восемь младших битов аргумента b. 24 старших бита B игнорируются.
Я создал этот код и он работает довольно хорошо:
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]