2010-05-11 4 views
0

Я использую ASyncSocket для перемещения некоторых UIImages с одного устройства на другое.Как вытащить UIImages из NSData из сокета

По существу, на одном устройстве, у меня есть:

NSMutableData *data = UIImageJPEGRepresentation(image, 0.1); 

if(isRunning){ 
    [sock writeData:data withTimeout:-1 tag:0]; 
} 

Так новый образ будет добавлен в сокет каждый так часто (например, веб-камера).

Затем на другом устройстве, я звоню:

[listenSocket readDataWithTimeout:1 tag:0]; 

, который ответит:

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
{ 
    [responseData appendData:data]; 
    [listenSocket readDataWithTimeout:1 tag:0]; 
} 

По существу, то, что я хочу быть в состоянии сделать, это иметь NSTimer собирается который будем называть @selector (PullImages):

-(void) PullImages { 

здесь, я хочу, чтобы быть в состоянии вывести изображения из ResponseD ата. Как мне это сделать? Возможно, изображение не может быть полным, может быть несколько изображений, может быть полтора изображения!

Я хочу проанализировать NSData в каждом существующем изображении!

} 

Любая помощь? Заранее спасибо!

ответ

2

Вы должны реализовать свой собственный протокол обертки вокруг изображений. Это может быть так же просто, как отправка длины данных изображения перед фактическими данными изображения. При получении данных вы теперь знаете, сколько байтов вам нужно вытащить, прежде чем у вас будет полное изображение. Поскольку каждое изображение разбито из потока, у вас есть длина следующего изображения.

Поскольку вы отправляете с одного iPhone на другой, вам не нужно беспокоиться о endianess и может просто использовать 32-битный int на каждом конце для размера.

+0

А, да, я надеялся не делать этого. Как я могу убедиться, что сначала получу целое число? Могу ли я предположить, что вещи сбрасываются как int, image, int, image и т. Д.? Итак, я прочитал первые несколько байтов, затем прочитал количество указанных байтов, затем прочитал следующие несколько байтов, а затем прочитал количество байтов, указанное? Не могли бы вы привести пример или макет? Мне не нужен специальный код. –

+0

Если вы используете tcp-сокет, то да, вы можете предположить, что ваши длины появятся перед изображением. Затем вы прочитаете первые 4 байта (для вашего int), затем прочитайте значение этих 4 байтов в вашем буфере данных. – Elfred

0

Просто используйте разделитель для отдельного определения различных изображений. Когда вы поймаете разделителя, вы знаете, что другое изображение появится дальше.

Смежные вопросы