我需要通过套接字连接下载图像。目前我有一个字节数组,其中包含一个.jpg文件以及一些其他不需要的字节(ffd8)。我需要从字节数组中删除这些不需要的字节。我尝试下载文件而不删除字节然后我得到了损坏格式的图像。所以我想知道如何从我的bytearray中删除不需要的字节。
在我的代码中:
while (!status) {
byte[] buffer = new byte[1024]; // or 4096, or more
int bytesRead = input.read(buffer, 0, buffer.length);
int availableBytes = input.available();
str2 = str2.append(bytesRead);
ImageDataArray = concat(ImageDataArray, buffer);
countPackets = countPackets + buffer.length;
if (input.available() != 0) {
System.out.println("String:" + str1.toString());
} else break;
}
System.out.println("--------------------out of while ------------------");
File file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), "/SteelmanPro/1020/images/image" +filename1);
if (!file.exists()) {
file.createNewFile();
}
}
write(ImageDataArray, Environment.getExternalStorageDirectory().getAbsoluteFile() + "/SteelmanPro/1020/images/image" +filename1);
concat()方法:
public byte[] concat(byte[]...arrays)
{
// Determine the length of the result array
int totalLength = 0;
for (int i = 0; i < arrays.length; i++)
{
totalLength += arrays[i].length;
}
// create the result array
byte[] result = new byte[totalLength];
// copy the source arrays into the result array
int currentIndex = 0;
for (int i = 0; i < arrays.length; i++)
{
System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length);
currentIndex += arrays[i].length;
}
return result;
}
写方法:
void write(byte[] aInput, String aOutputFileName) {
Log.e("dfd", "Writing binary file...");
try {
OutputStream output = null;
try {
output = new BufferedOutputStream(new FileOutputStream(aOutputFileName));
output.write(aInput);
} finally {
if (output != null)
output.close();
}
} catch (FileNotFoundException ex) {
Log.e("dfd", "File not found.");
} catch (IOException ex) {
Log.e("dfd", "" + ex);
}
}
答案 0 :(得分:1)
其中包含.jpg文件以及其他一些不需要的字节(ffd8) 我试图下载文件而不删除字节然后我得到了损坏格式的图像
由于删除FFD8
会导致您最终损坏,但您仍然会尝试这样做,需要采取哪些措施才能让您停止思考&#34;不需要的&#34;字节实际上是#34;非常想要&#34;? (双关语)
事实上,FF D8 FF
是JPEG magic number,是JPEG文件的一部分。
答案 1 :(得分:1)
您的代码充满了错误。
while (!status) {
byte[] buffer = new byte[1024]; // or 4096, or more
此数组应在循环外部分配。
int bytesRead = input.read(buffer, 0, buffer.length);
int availableBytes = input.available();
调用available()
通常毫无意义,这也不例外,尤其是因为您并未在任何地方使用availableBytes
。
str2 = str2.append(bytesRead);
如果这是一张图片,则不应将其存储在String
中。 String
不是二进制数据的容器。
ImageDataArray = concat(ImageDataArray, buffer);
由于您尚未发布ImageDataArray
,因此无法知道这意味着什么。
countPackets = countPackets + buffer.length;
错误。它应该是countPackets + bytesRead
。您不能假设read()
填充缓冲区。这就是它返回值的原因。
if (input.available() != 0) {
另一次滥用available()
。它不是对流结束或消息结束的测试。
System.out.println("String:" + str1.toString());
} else break;
}
System.out.println("--------------------out of while ------------------");
File file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), "/SteelmanPro/1020/images/image" +filename1);
if (!file.exists()) {
file.createNewFile();
}
当你即将创建一个名称相同的new FileOutputStream(...)
时,这个区块不仅多余而且浪费。
}
write(ImageDataArray, Environment.getExternalStorageDirectory().getAbsoluteFile() + "/SteelmanPro/1020/images/image" +filename1);
由于您尚未发布此write()
方法,因此无法对其进行评论。
concat()方法:
public byte[] concat(byte[]...arrays)
签名已经错了。你不知道这些数组中的任何一个都被填满了。见上文。
{
// Determine the length of the result array
int totalLength = 0;
for (int i = 0; i < arrays.length; i++)
{
totalLength += arrays[i].length;
}
// create the result array
byte[] result = new byte[totalLength];
// copy the source arrays into the result array
int currentIndex = 0;
for (int i = 0; i < arrays.length; i++)
{
System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length);
currentIndex += arrays[i].length;
}
return result;
}
您不需要整个方法。您应该在收到文件时将数据写入文件。而不是浪费内存并增加延迟。
不要写这样的代码。