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

WBXML定义了一种独立于平台的写入int值的方式:多字节整数

多字节整数由一系列八位字节组成,其中最高有效位是继续标志,其余七位是标量值。继续标志指示八位字节不是多字节序列的结尾。单个整数值被编码为 N 个八位字节的序列。前 N-1 个八位字节将继续标志设置为值一 (1)。系列中的最后一个八位字节的延续标志值为零 (0)。
每个八位字节中剩余的七位以大端顺序编码,例如,最高有效位在前。八位字节按大端顺序排列,例如,最重要的七位首先传输。在初始八位字节的值少于七位的情况下,所有未使用的位必须设置为零 (0)。
例如,整数值 0xA0 将使用两字节序列 0x81 0x20 进行编码。整数值 0x60 将使用一字节序列 0x60 进行编码。

我是为 Java ME 和 Bada 做的,但是用任何语言实现它都非常简单。

于 2012-10-28T11:49:38.700 回答
0

您的阅读代码处理文本文件,它一个接一个地工作,它检查换行符等。图像(“所以我只有字节”)似乎是二进制数据。当您将二进制数据解释为文本时,您会遇到各种随机错误。这些二进制数据可能包括例如一个“\n”,当一个像素的值恰好是 13 时。它还可能包括“\0”,它将在真正结束之前结束字符串。

首先存储大小时,将其作为 int 发送,用 4 个字节表示。当您将其作为 4 个单独的字符阅读时,您会得到一些垃圾。您还需要注意字节的顺序/字节序。java 使用“网络顺序”,在 x86 上,C 可能以相反的方式读取它。

您正在使用旧的 C 标准库。使用 C++ iostream 可能更容易。

于 2012-10-28T18:59:08.003 回答