ファイルをバイト配列にチャンク単位で読み込み、POST リクエストを介してネットワーク経由で Web サーバーに送信しています。これは複雑なことではありません。以前、まったく同じコードを使用して実行したことがあります。今回は、サーバーに届いたときに画像がかなり奇妙に見えることに気づいたので、送信されたバイト配列と受信されたバイト配列を調べて、同じであることを確認することにしました。同じではありません。Java の送信側では、バイト配列に負の数が含まれています。C# の受信側では、負の数はありません。
受信側の最初の15バイト(C#)
137
80
78
71
13
10
26
10
0
0
0
13
73
72
68
同じバイトですが、送信側(Java)
-119
80
78
71
13
10
26
10
0
0
0
13
73
72
68
負でない数はすべて同じで、-119 は唯一の負の数ではなく、至る所にあります。-119 と 137 は 256 離れていることに気付き、それが何か関係があるのではないかと考えました。
画像を読み取るために使用しているコード (java)
public static byte[] readPart(String fileName, long offset, int length) throws FileNotFoundException, Exception
{
byte[] data = new byte[length];
File file = new File(fileName);
InputStream is = new FileInputStream(file);
is.skip(offset);
is.read(data,0,data.length);
is.close();
return data;
}
データの書き込みに使用しているコード (c#)
private void writeFile(string fileName, Stream contents)
{
using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
int bufferLen = 65000;
byte[] buffer = new byte[bufferLen];
int count = 0;
while ((count = contents.Read(buffer, 0, bufferLen)) > 0)
{
fs.Write(buffer, 0, count);
}
fs.Close();
}
contents.Close();
}
それがいつも起こることなのか、今まで気づかなかっただけなのか、それとも何かひどい間違いを起こしてしまったのかはわかりません。私が知っているのは、このコードは以前は非常によく似た状況で機能していたのに、今は機能していないということです。
どなたか何か提案や説明がありましたら、本当に感謝いたします。
編集: 画像が奇妙に見えた理由は、readPart メソッドの呼び出し方法にありました。
byte[] data = FileUtilities.readPart(fileName,counter,maxFileSize);//counter is the current chunk number
私はそれをどう呼ぶべきだったのか
byte[] data = FileUtilities.readPart(fileName,counter*maxFileSize,maxFileSize);//the current chunk * cuhnksize for the offset...
みなさん、ありがとう。これで混乱がかなり減りました :)
ベストアンサー1
Javaでは、byte
符号付き値(2の補数負の値をエンコードするため、ほとんどの人にとって予想外の場合でも、正しいと表示されます。
をbyte
符号なしの値に変換するにはint
、b & 0xff