我已經創建了一個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