我创建了一个 java 服务器,它可以截取屏幕截图,调整它们的大小,然后通过 TCP/IP 将它们发送到我的 iPhone 应用程序。然后应用程序使用 NSInputStream 收集传入的图像数据,使用字节缓冲区创建一个 NSMutableData 实例,然后创建一个 UIImage 对象以在 iPhone 上显示。屏幕共享,本质上。我收集图像数据的 iPhone 代码目前如下:
- (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 文件中的标记,但是对此测试的任何帮助将不胜感激!
詹姆士