我正在学习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;
}
答案 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可能更容易。