今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

初心者にありがちなBUG

ストリームからデータを受信するとき。

    byte buf[] = new buf[SIZE];
    inputStream.read(buf, 0, buf.length);
        :

プログラムを書いた人は、第3引数で受信データサイズを指定しているので、必ずそれだけ受信できると思っている(第1引数は格納先バッファ、第2引数は格納開始オフセット)。しかし実際は要求したサイズ以下のデータしか受信できないこともある。
プログラムを書いた人は期待したデータを受け取っていると思っている。しかし、ストリームにはまだデータが残っている。次回以降の受信でデータが壊れていると錯覚する。先頭にある余計なデータは誰が送信したのだろうか、と悩むことになる。
この問題を解消するには、(例えば)以下のように書かなければならない。

    byte buf[] = new buf[SIZE];
    int receiveddSize = 0;
    while (receivedSize < buf.length) {
        int len = inputStream.read(buf, receivedSize, buf.length - receivedSize);
        receivedSize += len;
    }

# 最近、これが原因ではまっていた人がいたらしい。
んで、今日の夕方、ある人から電話があった。JPEG画像をHTTPで受信してファイルに書いているのだが、JPEGデータの後ろの方が切れてしまい、画像の下の部分が壊れているそうな。
ネットワーク上には完全なデータが流れているのが確認できているそうなので、上に書いた受信ロジックのミスではないかと踏んでいる。
電話では要求したサイズに満たないデータしか受信できないこと可能性があることを伝えたつもりだけど、解決できたのかなぁ。。。