所以基本上我想连接图像字节和字符串字节,并在转换回字符串格式时能够读取字符串字节。而且我无法读取字节的字符串部分。 我已经尝试过将字符串连接成字符串,并且效果很好,而且我认为它也可以用于图像和字符串,因为它以字节为单位。
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++;
}
是的,有可能这样做吗?如果没有,则无法进行
答案 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,否则使用默认值,这在不同平台之间是不同的。