Pergunta

Nós temos uma aplicação onde precisamos de-serialize alguns dados de um fluxo em vários objetos.

O conjunto de dados representa um número de mensagens de comprimento variável embalados em conjunto. Não há mensagem delimitando códigos no fluxo.

Queremos fazer algo como:

void Decode(byte[] Data)  
{  
    Object0.ExtractMessage(Data);
    Object1.ExtractMessage(Data);
    Object2.ExtractMessage(Data);
    ...
}  

onde cada chamada ProcessData sabe por onde começar na matriz. Idealmente nós faríamos isso sem passar uma referência DataIx em.

Para fazer isso em C ++ que tínhamos acabado de entregar em torno de um ponteiro para a matriz, e cada função ProcessData seria incrementá-lo conforme necessário.

Cada classe de objeto sabe como as suas próprias mensagens são serializados e pode ser invocada (em C ++) para retornar o ponteiro no início da mensagem seguinte no fluxo.

Existe algum mecanismo inato que podemos usar para fazer isso (sem passar unsafe)? A operação é alta frequência (~ 10kps) e muito leve. Nós também não quer ir copiando ou aparar a matriz.

Obrigado por sua ajuda.

Foi útil?

Solução

Você não poderia simplesmente passar e devolver o índice da matriz? Isso é basicamente tudo que um ponteiro é de qualquer maneira, um deslocamento a partir de uma localização fixa de memória.

Outras dicas

Bem isso soa como você deseja um fluxo simples (ex basta usar MemoryStream como um invólucro em torno de sua matriz de bytes: stream = new MemoryStream (data)). Apenas enrole a matriz de bytes em um fluxo e cada objeto lê tanto do fluxo como ele precisa e, em seguida, as mãos sobre o fluxo para o próximo item. Ele ainda tem a vantagem de que você não é obrigado a carregar a toda byte-array ao mesmo tempo.

Diferente do que você pode usar ponteiros em C # exatamente do jeito que você fez no C ++ (embora ponteiros exigem a palavra-chave insegura e eles são desencorajados)

Como alternativa, você poderia simplesmente passar dados e uma variável de índice e, em seguida, incrementar o índice (que é, na verdade, o mesmo que usar um ponteiro, mas não precisa inseguro).

Como cerca de embrulhar os dados em um MemoryStream e, em seguida, passar um StreamReader para o método ExtractMessage?

Eu acho que várias coisas vêm à mente.

poderia simular a acção do ponteiro enrolando o byte [] em uma classe que também mantido o deslocamento matriz. Sempre que você acessar a matriz que você acessá-lo através da classe, provavelmente através de um método de acesso, que devolveu o próximo byte e também incrementada a variável offset. A instância de classe pode ser passada entre os diferentes chamadas de função ExtractMessage.

Como sobre o uso de C ++ / CLI? Isso permitiria que você use C técnicas familiares / C ++, e ainda ser diretamente pode ser chamado de C # sem a interoperabilidade temido.

Então, claro, há a opção temida inseguro, em que você obter um ponteiro C # para o byte [] e executar a aritmética de ponteiro necessário.

Você pode criar um stream da matriz de bytes.

Stream stream = new MemoryStream(data);

Depois de poderia trabalhar no seu processador córregos vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top