Pergunta

Eu me pergunto qual é a melhor maneira de converter uma matriz de bytes (comprimento 4) em um número inteiro no vb.net? Estou ciente do BitConverter, mas parece um desperdício para fazer uma chamada de função para fazer algo que deve ser feito copiando 4 bytes de memória. Na mesma linha, que tal converter um único/duplo de sua representação binária para uma variável única/dupla.

Foi útil?

Solução

"Copiar bytes de memória" é algo que .NET não é particularmente adequado para (e VB.net ainda menos). Portanto, a menos que mudar para C seja uma opção para você, uma chamada de função é praticamente inevitável para isso.

O BitConverter é uma função testada e bem pensada. Claro, você pode evitá -lo fazendo algo como (em C#):

myInt = (*pbyte) | (*(pbyte + 1) << 8)  | (*(pbyte + 2) << 16) | (*(pbyte + 3) << 24);

(que é, aliás, exatamente O que o BitConverter faz para você ao converter uma matriz de bytes em um número inteiro ...).

No entanto, este código:

  • É muito, muito mais difícil de ler e entender do que o equivalente do BitConverter;
  • Não faz nenhum erro que a verificação do BitConverter faz por você;
  • Não diferencia as representações pouco endianas e grandes, como o BitConverter.

Em outras palavras: você pode "salvar" uma chamada de função, mas estará significativamente pior no final (mesmo supondo que não apresente nenhum bug). Em geral, a estrutura .NET é muito, muito bem projetada e você não deve pensar duas vezes em usar sua funcionalidade, a menos que você encontre problemas reais (de desempenho) com ele.

Outras dicas

Estou ciente do BitConverter, mas parece um desperdício para fazer uma chamada de função para fazer algo que deve ser feito copiando 4 bytes de memória.

Enquanto eu vejo a situação como "parece um desperdício tentando codificar manualmente uma maneira eficiente de fazer isso quando já existe uma chamada de método que faz exatamente o que eu quero".

A menos que você seja absolutamente convencido Que você tem um gargalo de desempenho nesse código exato de código, use a funcionalidade fornecida pela estrutura.

O MDB está exatamente correto, mas aqui está algum código para converter uma matriz de bytes VB em Little Endian Integer de qualquer maneira ... (apenas para o caso de você desejar escrever sua própria classe BitConverter)

'Onde bits () é sua variedade de bytes de comprimento 4

Dim i as Integer 

i = (((bits(0) Or (bits(1) << 8)) Or (bits(2) << &H10)) Or (bits(3) << &H18))

Você pode bloquear o copy byte [] para int [] usando a classe System.Buffer.

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