天道酬勤,学无止境

NSMutableData 删除字节?(NSMutableData remove bytes?)

问题

我可以使用appendData方法轻松地向 NSMutableData 实例添加字节,但是我没有看到任何类似的删除数据的方法? 我是否忽略了某些东西,还是需要创建一个新对象并仅复制我需要的字节?

回答1

请参阅以下方法的文档:

- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength

苹果明确表示如下:

如果范围的长度不等于replacementLength,则调整接收器的大小以容纳新字节。 接收器中超出范围的任何字节都被移位以容纳新字节。 因此,您可以为 replacementBytes 传递 NULL,为 replacementLength 传递 0 以删除范围范围内的接收器中的字节。 您还可以用比范围长度更多的字节替换范围(可能是零长度),这具有插入的效果(或“替换一些并插入更多”)。

要从末尾删除 10 个字节,请使用:

[data setLength:[data length] - 10];

它也可以通过replaceBytesInRange 来完成,但实际上它要快得多,因为字节并没有真正被删除。 相反,只更改了内部大小变量,并且 NSMutableData 的行为就像删除了字节一样。 IOW,这是一个 O(1) 操作(这意味着它总是需要同样长的时间来执行,无论您删除多少字节),而且速度非常快。

要从前面删除 10 个字节,请使用:

[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0];

要删除中间的 10 个字节(例如在 20 个字节之后),请使用:

[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0];

不过,replaceBytesInRange 是一个 O(n) 操作。 这意味着无论删除 100 个字节需要多长时间,删除 200 个字节都需要两倍的时间,依此类推。 它仍然非常快,并且仅受计算机内存 (RAM) 吞吐量的限制。 如果您有 10 MB 的数据并且从前面删除了 1 MB,则会复制 9 MB 以填补刚刚删除的 MB 的空白。 因此,操作的速度取决于您的系统将 9 MB RAM 从一个地址移动到另一个地址的速度。 这通常足够快,除非您处理包含数百 MB 的 NSMutableData 对象。

回答2

由于 NSMutableData 是与 CFMutableDataRef 桥接的免费电话,因此您可以使用 CFDataDeleteBytes() 函数:

NSMutableData *data = ...
CFDataDeleteBytes((CFMutableDataRef)data, CFRangeMake(3, 4));
回答3

如果要删除的数据在最后,可以使用

[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];

或使用 obj-c 2.0 语法

NSMutableDataInstance.length -= n;

对于比这更复杂的任何事情,我建议操作原始数据。

回答4

我看到这个线程有答案,但尽管如此,这可能是有价值的补充。 要从 NSMuttableData 中删除所有字节,您可以创建新数据并将其复制到原始数据:

[myData setData:[NSData dataWithBytes:NULL length:0]];

这很好用。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • NSString(hex)转换为字节(NSString (hex) to bytes)
    问题 Objective-C中是否有将十六进制字符串转换为字节的方法? 例如,将@"1156FFCD3430AA22"转换为unsigned char array {0x11, 0x56, 0xFF, ...} @"1156FFCD3430AA22" unsigned char array {0x11, 0x56, 0xFF, ...} 。 回答1 我能想到的最快的NSString类别实现(一些示例): - (NSData *)dataFromHexString { const char *chars = [self UTF8String]; int i = 0, len = self.length; NSMutableData *data = [NSMutableData dataWithCapacity:len / 2]; char byteChars[3] = {'\0','\0','\0'}; unsigned long wholeByte; while (i < len) { byteChars[0] = chars[i++]; byteChars[1] = chars[i++]; wholeByte = strtoul(byteChars, NULL, 16); [data appendBytes:&wholeByte length:1]; } return data
  • iOS 3des的加密与android和.net不同(Encryption for iOS 3des not same as android and .net)
    问题 我正在尝试使用iOS上的3des进行一些加密,这些加密必须与java和.NET的结果相匹配。 Java代码是: public class EncryptionHelper { // Encrypts string and encode in Base64 public static String encryptText(String plainText,String key, String IV) throws Exception { // ---- Use specified 3DES key and IV from other source -------------- byte[] plaintext = plainText.getBytes();//input byte[] tdesKeyData = key.getBytes();// your encryption key byte[] myIV = IV.getBytes();// initialization vector Cipher c3des = Cipher.getInstance("DESede/CBC/PKCS5Padding"); SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede"); IvParameterSpec
  • 加密iOS并解密Node.js AES(Encrypt iOS and Decrypt Node.js AES)
    问题 我在上下搜索了一个解决方案,并在Node.js服务器和Objective-C客户端上进行了加密,反之亦然,使用AES(或其他合适的方法)进行加密 我对密码学还比较陌生,因此我无法理解为什么每种语言的加密文本都不同。 这是我到目前为止所拥有的: 使用此CryptoJS库的Node.js加密方法-node-cryptojs-aes var node_cryptojs = require("node-cryptojs-aes"); var CryptoJS = node_cryptojs.CryptoJS; var textToEncrypt = 'Hello'; var key_clear = 'a16byteslongkey!'; //encrypted + decrypted var encrypted = CryptoJS.AES.encrypt(clearText, key_clear, { iv: null }); var decrypted = CryptoJS.AES.decrypt(encrypted, key_clear, { iv: null }); //Outputs console.log("encrypted: " + encrypted); //encrypted: U2FsdGVkX1/ILXOjqIw2Vvz6DzRh1LMHgEQhDm3OunY
  • 通过IV使用CommonCrypto,但始终返回nil(Using CommonCrypto with an IV but always returning nil)
    问题 我正在使用CommonCrypto CCCryptorCreate解密消息。 我正在使用密码和IV,但始终返回nil。 如果我使用CCCryptorCreate进行解密,但是在RUBY一侧的加密过程中不使用IV,而在obj-c解密侧不使用IV,那么解密就可以正常工作,并且我可以看到消息。 但是,如果我在RUBY上使用IV,而在obj-c侧使用IV,则解密将以nil消息对象结束。 我在Objective-C中使用此加密/在Ruby中使用任何东西解密 OBJ-C方法: - (NSData *) decryptedDataUsingAlgorithm: (CCAlgorithm) algorithm key: (id) key // data or string initializationVector: (id) iv // data or string options: (CCOptions) options error: (CCCryptorStatus *) error { CCCryptorRef cryptor = NULL; CCCryptorStatus status = kCCSuccess; NSParameterAssert([key isKindOfClass: [NSData class]] || [key isKindOfClass: [NSString
  • AES CBC中的CCCrypt解密即使没有IV也可以工作(CCCrypt decrypting in AES CBC works even without IV)
    问题 我有一个令人困惑的问题,在解密使用CCCrypt的AES-CBC模式和16字节随机IV加密的文件时,无论我传入的是用于加密的正确IV还是完全不加密,都会产生完全相同的输出。 我的期望:使用NULL IV进行解密不应导致正确的解密。 我观察到的结果:使用NULL IV的结果与用于加密的IV的结果相同。 为了完整起见,下面是重要的代码片段, iv作为16字节安全随机化的NSData传入。 我在这里不明白什么? CCCrypt是否以某种方式自己从加密数据中找出IV? 我在文档中找不到任何东西。 - (NSData *)encryptedDataForData:(NSData *)rawData withKey:(NSData *)key iv:(NSData *)iv error:(NSError __autoreleasing**)error { size_t outLength; NSMutableData *cipherData = [NSMutableData dataWithLength:rawData.length + kAlgorithmBlockSize]; CCCryptorStatus result = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCModeCBC, key
  • NSMutableData remove bytes?
    I can add bytes to a NSMutableData instance easily by using the appendData method, however I do not see any similar method for removing data? Am I overlooking something, or do I need to create a new object and copy over only the bytes I need?
  • 如何在iOS中将UIView转换为PDF?(How to Convert UIView to PDF within iOS?)
    问题 关于如何在应用程序的UIView显示PDF的资源很多。 我现在正在做的是从UIViews创建PDF。 例如,我有一个UIView ,带有诸如Textviews, UILabels , UIImages子视图,那么如何将一个大的UIView包括其所有子视图和子子视图整体转换为PDF? 我检查了Apple的iOS参考。 但是,它仅涉及将文本/图像写入PDF文件。 我面临的问题是我要以PDF格式写入文件的内容很多。 如果我将它们逐段写入PDF,这将是一项艰巨的工作。 这就是为什么我正在寻找一种将UIViews写入PDF甚至位图的方法。 我已经尝试过从Stack Overflow中的其他Q / A复制的源代码。 但这只给了我空白的PDF,且具有UIView边界大小。 -(void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename { // Creates a mutable data object for updating with binary data, like a byte array NSMutableData *pdfData = [NSMutableData data]; // Points the pdf converter to the
  • NSMutableData datawithBytesNoCopy:length:freeWhenDone:似乎在复制提供给它的缓冲区(NSMutableData datawithBytesNoCopy:length:freeWhenDone: seems to make a copy of the buffer provided to it)
    问题 根据Apple文档,类方法 + datawithBytesNoCopy:length:freeWhenDone: 继承自NSData 创建并返回一个数据对象,该数据对象保存给定缓冲区中给定字节数。 但 NSUInteger len = 1024; char *buffer = malloc(len); NSMutableData *data = [NSMutableData dataWithBytesNoCopy:buffer length:len freeWhenDone:YES]; char *dataBytes = data.mutableBytes; NSLog(@"%@", dataBytes == buffer ? @":D" : @":("); 印刷 :( 该方法似乎实际上在制作副本,但我不希望这样做。 我使用错误的方式吗? 等效的NSData方法按预期方式工作。 我将如何创建一个NSMutableData对象,该对象指向一个已经存在的缓冲区而没有任何所有权? 回答1 我猜想你就是做不到自己想做的。 毕竟,如果您有一个NSMutableData并向其添加更多数据,则需要重新分配该缓冲区,并且不再使用您提供的指针。 苹果公司的《二进制数据编程指南》说,对于NSMutableData ,无论如何都要复制字节。
  • NSMutableData 消失(NSMutableData disappearing)
    问题 在我的程序中,我有一个 NSMutableData 变量,它从 http://www.nhara.org/scored_races-2013.htm 收集信息。 大约第三次从网站获取信息后,当它包含 90810 个字节时,它要么消失,要么变为空,因为如果我将其打印为 NSString,则它为空。 这是代码 - (void)viewWillAppear:(BOOL)animated { // Create a new data container for the stuff that comes back from the service xmlData = [[NSMutableData alloc] initWithCapacity:180000]; [self fetchEntries]; [super viewWillAppear:animated]; } - (void)fetchEntries { // Construct a URL that will ask the service for what you want NSURL *url = [NSURL URLWithString: @"http://www.nhara.org/scored_races-2013.htm"];// // Put that URL into an NSURLRequest
  • 我们如何清除 NSMutableData 中的内容(How do we clear out contents in NSMutableData)
    问题 我们如何在不使用 release 的情况下清除 NSMutableData 然后再次重新分配/初始化以再次使用? 我正在考虑将 resetBytesInRange 设置为零,但我不确定这一点。 任何人都可以帮忙吗? 回答1 如果你想要一个空缓冲区: [data setLength:0]; 如果要保持其大小但将所有字节设置为零: [data resetBytesInRange:NSMakeRange(0, [data length])]; 回答2 将所有字节设置为零的 Swift 版本: data.resetBytes(in: NSRange(location:0, length:data.length))
  • 如何在iOS中实现Blowfish算法(How to implement Blowfish algorithm in iOS)
    问题 在iOS中实现BlowFish ECB加密的最佳方法是什么? 我已经在谷歌上搜索了很多东西,并在这里找到了图书馆。 但是没有该库的文档。 不知道如何使用它。 回答1 我从Bruce Schneier的网站上获得了Paul Kocher的实施。 加密方法如下所示: #define PADDING_PHRASE @" " #import "CryptoUtilities.h" #import "blowfish.h" #import "NSData+Base64Utilities.h" @implementation CryptoUtilities + (NSString *)blowfishEncrypt:(NSData *)messageData usingKey:(NSData *)secretKey { NSMutableData *dataToEncrypt = [messageData mutableCopy]; if ([dataToEncrypt length] % 8) { NSMutableData *emptyData = [[PADDING_PHRASE dataUsingEncoding:NSUTF8StringEncoding] mutableCopy]; emptyData.length = 8 - [dataToEncrypt length] %
  • 将HEX NSString转换为NSData(Converting HEX NSString To NSData)
    问题 我正在尝试将十六进制NSString转换为NSData (我正在使用下面的附加代码)。 以下是输出: <00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000> 与我完全无关。 关于哪里出了问题有任何想法/建议吗? NSString *strData = @"72ff63cea198b3edba8f7e0c23acc345050187a0cde5a9872cbab091ab73e553"; NSLog(@"string Data length is %d",[strData length]); NSMutableData *commandToSend= [[NSMutableData alloc] init]; unsigned char whole_byte; char byte_chars[2]; int i; for (i=0; i < [strData length]/2; i++) { byte_chars[0] = [strData characterAtIndex:i*2]; byte_chars[1] = [strData characterAtIndex:i*2+1]; whole_byte = strtol(byte_chars, NULL, [strData
  • 管理多个异步NSURLConnection连接(Managing multiple asynchronous NSURLConnection connections)
    问题 我的课堂上有很多重复的代码,如下所示: NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 异步请求的问题是,当您关闭各种请求,并且分配了一个委托将它们全部视为一个实体时,许多分支和丑陋的代码开始制定运行方式: 我们要获得什​​么样的数据? 如果包含此内容,请执行此操作,否则执行其他操作。 我认为能够标记这些异步请求将很有用,就像您可以使用ID标记视图一样。 我很好奇哪种策略对管理可处理多个异步请求的类最有效。 回答1 我在CFMutableDictionaryRef中跟踪响应,该响应由与其关联的NSURLConnection键入。 IE: connectionToInfoMapping = CFDictionaryCreateMutable( kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 使用它而不是NSMutableDictionary似乎很奇怪,但我这样做是因为此CFDictionary仅保留其键(NSURLConnection),而NSDictionary复制其键
  • 如何将 WAV/CAF 文件的样本数据转换为字节数组?(How to convert WAV/CAF file's sample data to byte array?)
    问题 我需要能够以编程方式读取 WAV(或 CAF)文件并仅将样本(音频)数据提取为字节数组。 最简单/最快的方法是什么? 回答1 假设您在 iOS 或 OS X 上,您需要 AudioToolbox 框架,特别是AudioFile.h (或ExtAudioFile.h如果您需要在读取时将音频数据转换为另一种格式)中的 API。 例如, #include <AudioToolbox/AudioFile.h> ... AudioFileID audioFile; OSStatus err = AudioFileOpenURL(fileURL, kAudioFileReadPermission, 0, &audioFile); // get the number of audio data bytes UInt64 numBytes = 0; UInt32 dataSize = sizeof(numBytes); err = AudioFileGetProperty(audioFile, kAudioFilePropertyAudioDataByteCount, &dataSize, &numBytes); unsigned char *audioBuffer = (unsigned char *)malloc(numBytes); UInt32 toRead = numBytes
  • Objective-C:DNS TXT记录(Objective-C: DNS TXT Record)
    问题 我一直在搜索没有任何成功,我应该如何在Objective-C中获取域的DNS TXT记录? 我的目标是获得与以下相同的输出: dig -t txt google.com +short PS:否,请使用NSTask / pipping! (我目前正在这样做,但这很糟糕)。 该代码可以用C编写,我稍后再写一个包装器。 我不在乎AppStore规则。 谢谢! 回答1 使用DNSServiceQueryRecord在dns_sd.h : #import <dns_sd.h> // ... DNSServiceRef serviceRef; DNSServiceQueryRecord(&serviceRef, 0, 0, "hmspl.de", kDNSServiceType_TXT, kDNSServiceClass_IN, queryCallback, NULL); DNSServiceProcessResult(serviceRef); DNSServiceRefDeallocate(serviceRef); // ... static void queryCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode
  • 从CMBlockBuffer提取h264(Extracting h264 from CMBlockBuffer)
    问题 我正在使用Apple VideoTool Box(iOS)压缩设备相机捕获的原始帧。 使用包含CMBlockBuffer的CMSampleBufferRef对象调用我的回调。 CMBlockBuffer对象包含H264基本流,但我找不到任何获取指向基本流的指针的方法。 当我在控制台中打印CMSampleBufferRef对象时,我得到了: (lldb) po blockBufferRef CMBlockBuffer 0x1701193e0 totalDataLength: 4264 retainCount: 1 allocator: 0x1957c2c80 subBlockCapacity: 2 [0] 4264 bytes @ offset 128 Buffer Reference: CMBlockBuffer 0x170119350 totalDataLength: 4632 retainCount: 1 allocator: 0x1957c2c80 subBlockCapacity: 2 [0] 4632 bytes @ offset 0 Memory Block 0x10295c000, 4632 bytes (custom V=0 A=0x0 F=0x18498bb44 R=0x0)
  • NSMutableData disappearing
    in my Program, I have a NSMutableData variable that collect the information from http://www.nhara.org/scored_races-2013.htm. After about the third time it gets information from a website, when it contains 90810 bytes, it either disappears or becomes null because if I print it a NSString, it is null. Here is the code - (void)viewWillAppear:(BOOL)animated { // Create a new data container for the stuff that comes back from the service xmlData = [[NSMutableData alloc] initWithCapacity:180000]; [self fetchEntries]; [super viewWillAppear:animated]; } - (void)fetchEntries { // Construct a URL that
  • 如何从NSFileHandle逐行读取数据?(How to read data from NSFileHandle line by line?)
    问题 我有一个文本文件,具有给定的数据 例如 PUFGUjVRallYZDNaazFtVjVObU1zWm5ZcUJUYU5ORk4zbGthNHNDVUdSMlFVQmpSVEoxUUNSallYaFhkanBITXBGR1NTQnpZRTltZE1OalVzSkdXQ0Z6WXR0V2RpTmpTdXgwTWs5V1lZSkZiWjFXT29OV2JSVlhaSTUwYUpwR040UUZXTzVHVXFoWFVRcFdWNHdVTUJ0Q1VHSmxXVlJVTlJCMVE1VTFWV PUFGUjVRallYZDNaazFtVjVObU1zWm5ZcUJUYU5ORk4zbGthNHNDVUdSMlFVQmpSVEoxUUNSallYaFhkanBITXBGR1NTQnpZRTltZE1OalVzSkdXQ0Z6WXR0V2RpTmpTdXgwTWs5V1lZSkZiWjFXT29OV2JSVlhaSTUwYUpwR040UUZXTzVHVXFoWFVRcFdWNHdVTUJ0Q1VHSmxXVlJVTlJCMVE1VTFWV 现在,我想逐行读取数据。 这意味着我首先要阅读
  • 创建一个大的虚拟文件(Creating a large Dummy File)
    问题 我是这个社区的新手,也是iOS开发的新手,我希望有人可以帮助我解决一些小问题... 目前,我正在为自己编写一个小应用程序,该应用程序应该创建一个非常大的虚拟文件,其中包含虚拟数据或单词或任何使其变大的文件。 原因是,我想单击一个按钮,应用程序应生成一个4 gb的文件并将其保存到磁盘,其他应用程序无法使用它,因为它不是免费的...如果我需要4 gb的可用空间,我只需要打开我的小应用程序,然后单击另一个按钮,该文件将被删除,并且我得到了4 gb的可用磁盘空间... 我知道如何将文件写入磁盘,但我不知道如何在短时间内生成大量数据,使其达到4 GB或更大的容量??? 有人知道如何用for循环或类似的东西生成这么大的文件吗? 回答1 如果您只想占用4GB的磁盘空间,则创建一个文件,查找到4GB并写入一个字节。 这将创建一个“稀疏文件”,其中包含几乎没有时间的几乎没有数据! 这是C: #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> ... int fd = open("/path/to/file", O_WRONLY, 0644); if (fd >= 0) { lseek(fd, 4 * 1024 * 1024 * 1024, SEEK_SET); write(fd
  • 在目标C中通过POST上传图像(Uploading Image via POST in Objective C)
    问题 我目前正在通过HTTP Post将图像上传到服务器,似乎无法找到一种方法来构建调用该服务的网址。 用户从库或照相机中选择一个图像,然后调用执行插入语句的json服务。 该服务期望以下uritemplate: @"%@/DataTransfer/SetUserProfileImage?EMP_ID=%@&image=%@&imageName=%@" 期望将图像数据以某种方式转换为字符串并通过url发送。 这是我当前的代码: - (BOOL)setUserProfileImage:(UIImage *)imgUser Name:(NSString *)strName{ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; NSData *dataImage = UIImagePNGRepresentation(imgUser); NSString* theNSString = [[NSString alloc] initWithData:dataImage encoding:NSASCIIStringEncoding]; NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@