Данные добавляются с сервера

Я работаю над приложением, которое использует NSOutputStream и NSInputStream, чтобы попробовать его и посмотреть, что я могу сделать. Я изменил это руководство, чтобы позволить мне использовать старый компьютер в качестве сервера! У меня проблема с тем, что я пытаюсь отправить словарь через NSOutputStream, а затем получить его. К сожалению, сервер, кажется, добавляет байт данных, поэтому я не могу успешно разархивировать данные. Вот мой код....

    //sending the data
     NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
        [dic setObject:@"hi" forKey:@"hello"];
        [dic setObject:@"whats up" forKey:@"huh"]; 
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dic];//data is 365 bytes
        NSLog(@"%@",data);
        [self.outputStream write:data.bytes maxLength:data.length];



    //receiving data from NSInputStream
    case NSStreamEventHasBytesAvailable:
        NSLog(@"has bytes available");
        //_mutData = [NSMutableData new];
        _mutData = [[NSMutableData alloc] init];
        if (theStream == inputStream) {

            uint8_t buffer[1024];
            int len;

            while ([inputStream hasBytesAvailable]) {
                len = [inputStream read:buffer maxLength:sizeof(buffer)];
                if (len > 0) {



                    [_mutData appendBytes:buffer length:len];
                    NSLog(@"Data:  %@",_mutData);
                    NSLog(@"appended bytes");



                }
            }
        }
        break;

    // trying to make the data into the dictionary
    NSDictionary *dic = [NSKeyedUnarchiver unarchiveObjectWithData:_mutData];
        NSLog(@"%@",dic);

При попытке разархивировать OjectWithData я получаю сообщение об ошибке "* - [NSKeyedUnarchiver initForReadingWithData:]: непонятный архив (0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30)".

При просмотре данных выясняется, что все они одинаковы, за исключением двух последних значений данных, поступающих с сервера, которые добавляют "0a" в конец данных.

У меня вопрос, что происходит не так, почему эти данные добавляются где-то на сервере? Спасибо за любую помощь!

1 ответ

Пока я понятия не имею, что на самом деле идет не так и как заставить это работать, просто отправляя данные и получая данные. Вам нужна какая-то завершающая часть, чтобы сделать эту работу, поэтому я использовал два метода преобразования NSData в NSString, а затем преобразовал NSString в NSData.

    -(NSData *)interprateHexStringToData:(NSString *)hexString { 

    char const *chars = hexString.UTF8String; 
    NSUInteger charCount = strlen(chars); 
    NSUInteger byteCount = charCount / 2; 
    uint8_t *bytes = malloc(byteCount); 
    for (int i = 0; i < byteCount; ++i) { 
    unsigned int value; 
    sscanf(chars + i * 2, "%2x", &value); 
    bytes[i] = value; 
    } 
    return [NSData dataWithBytesNoCopy:bytes length:byteCount freeWhenDone:YES]; 
    } 

    -(NSString *)makeDataIntoString:(NSData *)data { 

    NSUInteger dataLength = [data length]; 
    NSMutableString *string = [NSMutableString stringWithCapacity:dataLength*2]; 
    const unsigned char *dataBytes = [data bytes]; 
    for (NSInteger idx = 0; idx < dataLength; ++idx) { 
    [string appendFormat:@"%02x", dataBytes[idx]]; 
    } 

    return string; 

    } 

чтобы отправить мои данные, я переключился на это.

    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; 

    [dic setObject:@"hi" forKey:@"hello"]; 
    [dic setObject:@"whats up" forKey:@"huh"]; 

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dic]; 

    NSLog(@"%@",data); 


    NSString *setUpString = [NSString stringWithFormat:@"||||%@",[self                 makeDataIntoString:data]]; 
    NSData *stringData = [setUpString dataUsingEncoding:NSUTF8StringEncoding]; 



    [self.outputStream write:stringData.bytes maxLength:stringData.length]; 

Чтобы отсортировать мои данные, как только я вернул их с сервера, я сделал это.

    NSString *stringData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

    NSLog(@"%@",stringData); 

    NSString *changed = [stringData stringByReplacingOccurrencesOfString:@"||||" withString:@""]; 
    NSLog(@"%@",changed); 
    NSData *dataFromTheString = [self interprateHexStringToData:changed]; 
    NSLog(@"%@",dataFromTheString); 
    @try { 
    NSDictionary *dictonary = [NSKeyedUnarchiver unarchiveObjectWithData:dataFromTheString]; 
    NSLog(@"%@",dictonary); 
    } 
    @catch (NSException *exception) { 
    NSLog(@"%@",exception); 
    }

Я не мог бы прийти к такому выводу без сангонической ссылки на этот другой пост. GCDAsyncSocket изменяет данные во время транспортировки. Спасибо!

Другие вопросы по тегам