我已经创建了一个java服务器,它可以截取屏幕截图,调整它们大小,并通过TCP/IP将它们发送到我的iPhone应用程序。然后,应用程序使用NSInputStream收集传入的图像数据,使用字节缓冲区创建一个NSMutableData实例,然后创建一个UIImage对象以在iPhone上显示。屏幕共享,本质上。我的iPhone的代码来收集图像数据目前情况如下:流式传输JPEG,检测JPEG结束
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent{
if(streamEvent == NSStreamEventHasBytesAvailable && [iStream hasBytesAvailable]){
uint8_t buffer[1024];
while([iStream hasBytesAvailable]){
NSLog(@"New Data");
int len = [iStream read:buffer maxLength:sizeof(buffer)];
[imgdata appendBytes:buffer length:len];
fullen=fullen+len;
/*Here is where the problem lies. What should be in this
if statement in order to make it test the last byte of
the incoming buffer, to tell if it is the End of Image marker
for the end of incoming JPEG file?
*/
if(buffer[len]=='FFD9'){
UIImage *img = [[UIImage alloc] initWithData:imgdata];
NSLog(@"NUMBER OF BYTES: %u", len);
image.image = img;
}
}
}
}
我的问题,通过在代码注释所示,是搞清楚何时停止在NSMutableData对象采集数据,并利用这些数据来创建一个UIImage。在传入字节中寻找JPEG文件结尾标记 - 图像结束(EOI)标记(FFD9)似乎是有意义的,因为发送该图像时将准备好显示图像。我该如何测试?我要么丢失了关于如何存储数据的内容,要么关于JPEG文件中的标记,但是在测试中有任何帮助将不胜感激!
詹姆斯
1)'buffer [len]'超过了它所读取的块的末尾,这只是'len'字节长(因此最后一个索引是'len-1'和2)''FFD9'是不是一个字节,它是4个字节;你可能是指'0xFFD9',它是2个字节,但你必须以某种方式读取最后2个字节,而不是最后一个字节;然后你必须单独测试字节,否则不得不担心排序 – user102008 2011-04-29 21:59:54