读取图像从j2me到c ++

时间:2012-10-27 15:23:35

标签: java c++ c sockets java-me

我正在学习c ++以创建一个显示图像流的小应用程序。这些图像来自一个j2me设备,它没有存储为文件(所以我只有字节)。

我想我需要先将图像的大小作为int发送,然后客户端知道要在流中为该特定图像读取多少内容。

我的问题是大小总是太大 - 当我最初只是尝试读取大小时(图片的大小)我在socket.write(int)中的java服务器中发送此长度并尝试了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;

}

2 个答案:

答案 0 :(得分:0)

WBXML定义了一种独立于平台的方式来编写int值:Multy-byte integers

  

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

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

答案 1 :(得分:0)

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

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

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