0

画像ストリームを表示する小さなアプリケーションを作成するために、c++ を学習しています。画像は、ファイルとして保存されていないj2meデバイスからのものです(したがって、バイトだけがあります)。

最初に画像のサイズを int として送信する必要があると考えているので、クライアントはストリーム内のその特定の画像をどれだけ読み取るかがわかります。

私の問題は、サイズが常に大きすぎることです-最初にサイズを読み込もうとしたときの画像のサイズではありません(この長さをjavaサーバーでsocket.write(int)で送信し、dataoutputstream.writeIntを試しました)。おそらくかなり単純なので、いくつかのコードを投稿します。

送ったものとサイズが違うのはなぜですか?

 ssize_t
 readLine(int fd, char *buffer, size_t n)
 {
 ssize_t numRead, tt;                    /* # of bytes fetched by last read() */
 size_t totRead;                     /* Total bytes read so far */
 char *buf;
 char ch;

 if (n <= 0 || buffer == NULL) {

     return -1;
 }

 buf = buffer;                       /* No pointer arithmetic on "void *" */

 totRead = 0;
 for (;;) {
     numRead = read(fd, &ch, 1);
     tt += numRead;
     if (numRead == -1) {

             return -1;              /* Some other error */

     } else if (numRead == 0) {      /* EOF */
         if (totRead == 0)           /* No bytes read; return 0 */
             return 0;
         else                        /* Some bytes read; add '\0' */
             break;

     } else {                        /* 'numRead' must be 1 if we get here */
         if (totRead < n - 1) {      /* Discard > (n - 1) bytes */
             totRead++;
             *buf++ = ch;
         }

         if (ch == '\n')
             break;
     }
 }

 printf("read line %s ", buf);
 fflush(stdout);
 int test = (int)buf;
 printf("read line int %i ", tt);
  fflush(stdout);
 *buf = '\0';
 return totRead;

}

4

2 に答える 2

0

読み取りコードはテキストファイルを処理し、次々に文字を処理し、改行をチェックします。画像(「バイトがあるだけ」)はバイナリデータのようです。バイナリデータをテキストとして解釈すると、あらゆる種類のランダムエラーが発生します。これらのバイナリデータには、たとえば、ピクセルの値が13の場合、「\ n」が含まれる場合があります。また、実際の終了前に文字列を終了する「\0」が含まれる場合もあります。

サイズを最初に格納するときは、4バイトで表されるintとして送信します。それを4つの別々の文字として読むと、ごみが出ます。バイトの順序/エンディアンにも注意する必要があります。javaは「ネットワーク順序」を使用します。x86では、Cはそれを逆に読み取る場合があります。

古いC標準ライブラリを使用しています。C++iostreamを使用する方が簡単な場合があります。

于 2012-10-28T18:59:08.003 に答える
0

WBXMLプラットフォームに依存しない値の書き込み方法を定義しintます:マルチバイト整数

マルチバイト整数は一連のオクテットで構成され、最上位ビットは継続フラグで、残りの 7 ビットはスカラー値です。継続フラグは、オクテットがマルチバイト シーケンスの最後ではないことを示します。単一の整数値は、N オクテットのシーケンスにエンコードされます。最初の N-1 オクテットには、値 1 に設定された継続フラグがあります。一連の最後のオクテットの継続フラグ値はゼロ (0) です。
各オクテットの残りの 7 ビットは、ビッグ エンディアンの順序でエンコードされます。たとえば、最上位ビットが最初になります。オクテットはビッグエンディアン順に配置されます。たとえば、最上位の 7 ビットが最初に送信されます。最初のオクテットの値が 7 ビット未満の場合、未使用のビットはすべてゼロ (0) に設定する必要があります。
たとえば、整数値 0xA0 は、2 バイト シーケンス 0x81 0x20 でエンコードされます。整数値 0x60 は、1 バイト シーケンス 0x60 でエンコードされます。

私は Java ME と Bada でそれを行いましたが、どの言語でも簡単に実装できます。

于 2012-10-28T11:49:38.700 に答える