Concat和读取图像字节和字符串字节

时间:2019-12-05 08:52:34

标签: java byte

所以基本上我想连接图像字节和字符串字节,并在转换回字符串格式时能够读取字符串字节。而且我无法读取字节的字符串部分。 我已经尝试过将字符串连接成字符串,并且效果很好,而且我认为它也可以用于图像和字符串,因为它以字节为单位。

   BufferedImage img = ImageIO.read(new File("src/Client/sample img.jpg"));
   ImageIO.write(img , "jpg", baos);
   baos.flush();
   String information = "\"Image Information\"";
   byte[] buffer = baos.toByteArray();
   byte[] info = information.getBytes();
   byte[] concat = new byte[buffer.length + info.length];
   System.arraycopy(buffer, 0, concat, 0, buffer.length);
   System.arraycopy(info, 0, concat, buffer.length, info.length);

如果字节是可读字符串,这就是我的读法

StringBuilder ret = new StringBuilder(); 
int i = 0; 
while (concat[i] != 0) 
{ 
    if((char) concat[i] == '"'){
         ret.append((char) concat[i]);
         i++;
         while ((char) concat[i] != '"') 
         {
             ret.append((char) concat[i]);
             i++;
         }
         break;
    }
    i++; 
} 

是的,有可能这样做吗?如果没有,则无法进行

2 个答案:

答案 0 :(得分:2)

我认为您可以在数组开头添加1个int(4个字节)。此int将存储图像数组的长度。您可以从字节数组读取前4个字节,识别图像字节数组的大小(例如N),然后读取N个图像字节,然后读取字符串字节。

我认为结果应该是这样的:

byte[] buffer = baos.toByteArray();
byte[] info = information.getBytes();
byte[] length = intToBytes(buffer.length);
byte[] concat = new byte[length.length + buffer.length + info.length];
System.arraycopy(length, 0, concat, 0, buffer.length);
System.arraycopy(buffer, 0, concat, length.length, buffer.length);
System.arraycopy(info, 0, concat, buffer.length + length.length, info.length);

答案 1 :(得分:1)

这是问题所在,因为图像字节没有大小信息。 读取图像可能会在结尾处丢弃字符串字节。

Path imgPath = Paths.get("src/Client/sample img.jpg");

byte[] packed(Path imgPath, String information) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    //Path imgPath = Paths.get("src/Client/sample img.jpg");
    byte[] buffer = Files.readAllBytes(path);
    byte[] len = ByteBuffer.allocate(4).putInt(buffer.length).array());
    baos.write(len); // Would be nice to be able to find the information string.
    baos.write(buffer, 0, buffer.length);

    byte[] info = information.getBytes(StandardCharsets.UTF_8);
    baos.writer(buffer, info);

    byte[] concat = baos.toByteArray();
    return concat;
}

String unpackedInformation(byte[] packedBytes) {
    ByteBuffer bb = ByteBuffer.wrap(packedBytes);
    int imgLength = bb.getInt();

    byte[] info = Arrays.copyOfRange(packedBytes, Integer.SIZE + imgLength,
            packedBytes.length);
    return new String(info, StandardCharsets.UTF_8);
}

还使用带有字符集的getBytes和new String,否则使用默认值,这在不同平台之间是不同的。