Данные добавляются с сервера
Я работаю над приложением, которое использует 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 изменяет данные во время транспортировки. Спасибо!