Nsmutabledata remover bytes?
-
23-09-2019 - |
Pergunta
Eu posso adicionar bytes a uma instância nsmutabledata facilmente usando o appendData
Método, no entanto, não vejo método semelhante para remover dados? Estou com vista para algo, ou preciso criar um novo objeto e copiar apenas os bytes de que preciso?
Solução
Consulte a documentação do seguinte método:
- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength
A Apple diz claramente o seguinte:
Se o comprimento da faixa não for igual ao comprimento de reposição, o receptor será redimensionado para acomodar os novos bytes. Quaisquer bytes anteriores no receptor são deslocados para acomodar os novos bytes. Portanto, você pode passar nulo para substituição e 0 para o comprimento de reposição para excluir bytes no receptor no intervalo. Você também pode substituir um intervalo (que pode ter um comprimento de zero) por mais bytes do que o comprimento do intervalo, que tem o efeito da inserção (ou "substitua alguns e insira mais").
Para remover 10 byte do final, use:
[data setLength:[data length] - 10];
Isso também pode ser feito via SubstituyTesinRange, mas é de fato muito mais rápido, porque os bytes não são realmente removidos. Em vez disso, apenas a variável de tamanho interna é alterada e o NSMutabledata se comportará como se os bytes fossem removidos. Iow, esta é uma operação O (1) (isso significa que sempre levará igualmente longas para executar, independentemente de quantos bytes você remove), e é muito rápido.
Para remover 10 byte de frente, use:
[data replaceBytesInRange:NSMakeRange(0, 10) withBytes:NULL length:0];
Para remover 10 bytes no meio (por exemplo, após 20 bytes), use:
[data replaceBytesInRange:NSMakeRange(20, 10) withBytes:NULL length:0];
O substituto de reposição é uma operação O (n), no entanto. Isso significa que não importa quanto tempo leva para remover 100 byte, levará o dobro do tempo para remover 200 bytes e assim por diante. Ainda é muito rápido e apenas limitado pela taxa de transferência da memória do seu computador (RAM). Se você tiver 10 MB de dados e remover 1 MB da frente, 9 MB serão copiados para preencher a lacuna do MB recém -removido. Portanto, a velocidade da operação depende da rapidez com que seu sistema pode mover 9 MB de RAM de um endereço para outro. E isso geralmente é rápido o suficiente, a menos que você lide com objetos NSMutableData contendo centenas de MB.
Outras dicas
Deve haver receptor de evento de recursos que adicionará o tipo de conteúdo programaticamente à biblioteca, por favor, dê uma olhada se houver qualquer
Se os dados que você deseja remover estiver no final, você pode usar
[NSMutableDataInstance setLength:[NSMutableDataInstance length] - n];
ou com a sintaxe OBJ-C 2.0
NSMutableDataInstance.length -= n;
Para qualquer coisa mais complicada do que isso, eu recomendaria manipular os dados brutos.
Vejo que este tópico tem a resposta, mas, no entanto, isso pode ser valioso adicionar. Para remover todos os bytes do NSMuttabledata, você pode criar novos dados e copiá -los para o original:
[myData setData:[NSData dataWithBytes:NULL length:0]];
Isso funciona muito bem.