Работа с непостоянными двоичными данными
Эта статья содержит примеры кода общих задач, применяющихся в частности к непостоянным объектам данных, NSMutableData
объекты. В основном можно изменить байты в непостоянном объекте двоичных данных, заставив массив байтов изменить непосредственно, добавив байты им или заменив диапазон байтов.
Изменение байтов
Два NSMutableData
примитивные методы —mutableBytes
и setLength:
— обеспечьте основание для всех других методов в классе. mutableBytes
метод возвращает указатель для записи в байты, содержавшиеся в непостоянном объекте данных. setLength:
метод позволяет Вам усекать или расширять длину непостоянного объекта данных. increaseLengthBy:
метод также позволяет Вам изменять длину непостоянного объекта данных.
В перечислении 1, mutableBytes
используется для возврата указателя на байты в data2
. Байты в data2
тогда перезаписываются с содержанием data1
.
Перечисление 1 , Изменяющее байты
NSMutableData *data1, *data2; |
NSString *myString = @"string for data1"; |
NSString *yourString = @"string for data2"; |
const char *utfMyString = [myString UTF8String]; |
const char *utfYourString = [yourString UTF8String]; |
unsigned char *firstBuffer, secondBuffer[20]; |
/* initialize data1, data2, and secondBuffer... */ |
data1 = [NSMutableData dataWithBytes:utfMyString length:strlen(utfMyString)+1]; |
data2 = [NSMutableData dataWithBytes:utfYourString length:strlen(utfYourString)+1]; |
[data2 getBytes:secondBuffer length:20]; |
NSLog(@"data2 before: \"%s\"\n", (char *)secondBuffer); |
firstBuffer = [data2 mutableBytes]; |
[data1 getBytes:firstBuffer length:[data2 length]]; |
NSLog(@"data1: \"%s\"\n", (char *)firstBuffer); |
[data2 getBytes:secondBuffer length:20]; |
NSLog(@"data2 after: \"%s\"\n", (char *)secondBuffer); |
Это - вывод от Перечисления 1:
Oct 3 15:59:51 [1113] data2 before: "string for data2" |
Oct 3 15:59:51 [1113] data1: "string for data1" |
Oct 3 15:59:51 [1113] data2 after: "string for data1" |
Добавление байтов
appendBytes:length:
и appendData:
методы позволяют Вам добавить байты или содержание другого объекта данных к непостоянному объекту данных. Например, Перечисление 2 копирует байты в data2
в aBuffer
, и затем добавляет aBuffer
к data1
:
Перечисление 2 , Добавляющее байты
NSMutableData *data1, *data2; |
NSString *firstString = @"ABCD"; |
NSString *secondString = @"EFGH"; |
const char *utfFirstString = [firstString UTF8String]; |
const char *utfSecondString = [secondString UTF8String]; |
unsigned char *aBuffer; |
unsigned len; |
data1 = [NSMutableData dataWithBytes:utfFirstString length:strlen(utfFirstString)]; |
data2 = [NSMutableData dataWithBytes:utfSecondString length:strlen(utfSecondString)]; |
len = [data2 length]; |
aBuffer = malloc(len); |
[data2 getBytes:aBuffer length:[data2 length]]; |
[data1 appendBytes:aBuffer length:len]; |
Окончательное значение data1
серия символов ASCII "ABCDEFGH"
.
Замена байтов
Можно заменить диапазон байтов в непостоянном объекте данных с нулями с помощью resetBytesInRange:
метод, или с различными байтами с помощью replaceBytesInRange:withBytes:
метод. В Перечислении 3, диапазоне байтов в data1
заменяется байтами в data2
, и содержание data1
изменения от “Лиз и Джона” “Лиз и Ларри”:
Перечисление 3 , Заменяющее байты
NSMutableData *data1, *data2; |
NSString *myString = @"Liz and John"; |
NSString *yourString = @"Larry"; |
const char *utfMyString = [myString UTF8String]; |
const char *utfYourString = [yourString UTF8String]; |
unsigned len; |
unsigned char *aBuffer; |
NSRange range = {8, strlen(utfYourString)}; |
data1 = [NSMutableData dataWithBytes:utfMyString length:strlen(utfMyString)]; |
data2 = [NSMutableData dataWithBytes:utfYourString length:strlen(utfYourString)]; |
len = [data2 length]; |
aBuffer = malloc(len); |
[data2 getBytes:aBuffer length:len]; |
[data1 replaceBytesInRange:range withBytes:aBuffer]; |