Sunday 16 July 2017

Little Endian Binário Opções


Windows em IntelAMD é little-endian também, portanto, nenhuma conversão endianness é necessária. Agora, se você pode mostrar o registro específico e de onde você obtém os dados binários, será mais fácil responder. Você pode ler qualquer tipo de registro de um arquivo. Se seu registro é declarado assim que tem exatamente o mesmo layout como os dados binários, você pode ler um registro inteiro de uma só vez. Se não, você terá que ler cada campo separadamente. Geralmente, você pode ler registros, ou campos individuais de um registro, a partir de um fluxo usando Se seus dados vêm de um soquete TCP, você pode, por exemplo, gravá-lo em um TMemoryStream, como bytes. Em seguida, você pode redefinir o ponteiro do fluxo para o início e ler os dados como mostrado. Como David comentou, se os bytes vêm sobre a conexão TCP na ordem de bytes da rede, então faz sentido executar cada campo através de uma das funções WinSock ntohs () ou ntohl (). Depois de tudo o acima, mas antes de os itens no registro são usados. Ntohs () converte tipos de 2 bytes, enquanto ntohl () converte tipos de 4 bytes. Para enviar itens, use as funções reversa htons () e htonl () em cada item do registro antes de enviá-los (separadamente). FWIW, é bastante fácil, no Win32, para alterar endianness usando: Eu preciso enviar mensagem do servidor do Windows para o servidor HP para sockets TCPIP. Estou usando o Framework 4.0 com Visual Studio 2012. Estou impressionado em converter pouco para endian grande. Eu armazenar todos os valores que tem de ser enviado para a outra máquina em uma estrutura e, em seguida, converter a estrutura para uma matriz de bytes. Esta matriz de bytes é então enviada através do soquete. Existem várias estruturas de mensagens como esta e nós desenvolvemos totalmente. Agora foi dito que o outro sistema é o servidor HP e precisamos converter em Big Endian antes de enviá-lo e também converter o Big Endian para Little Endian depois de recebermos os dados. Existe alguma maneira fácil para converter isso no formulário de estrutura A estrutura que eu tenho: O código que eu uso para converter uma estrutura para uma matriz de bytes: No código abaixo a variável quotmessagequot contém a estrutura ACMMessage eo byteArray é retornado. Em seguida, o byteArray é enviado através do socket TCPIP. O copyStartIndex será sempre 0 neste maiúsculas e minúsculas. Neste tipo de desenvolvimento, como devo converter de lixo para endian grande e vice-versa Se é um único campo como duplo ou seqüência ou inteiro ele vai funcionar como você disse. Mas eu estou trabalhando com uma estrutura. Isso realmente não importa. Você sabe quantos bytes leva para representar cada campo da estrutura, isso é determinado pelo tipo de dados para a maioria de seus campos e pela constante de tamanho especificada para a seqüência de caracteres. Você também sabe que cada dado de campos está presente na ordem declarada porque você especificou Layout Seqüencial. Portanto, use qualquer um dos métodos propostos para reverter uma matriz de bytes e converter cada subchunk da matriz de bytes global de acordo com cada tamanho de campo. Dado este exemplo de layout: Você deve ser capaz de usar uma rotina algo como isto: Reed Kimble - quotWhen você faz as coisas certas, as pessoas não será certo youve feito nada em allquot Proposta como resposta por dbasnett quarta-feira, 01 de outubro de 2014 10:53 Marcado como resposta por Carl Cai Moderador terça-feira, 7 de outubro de 2014 6:02 Terça-feira, 30 de setembro de 2014 17:11 Eu acho que sua estrutura é muito grande. Você pode considerar convertê-lo em uma classe com propriedades e adicionar o código que você está procurando para essa classe. Eu prevejo dois métodos que cada retorno uma matriz de bytes, ToBigEndian e ToLittleEndian. Talvez você deva explicar como você converte sua estrutura postada em uma array quotbyte. Marque as melhores respostas como respostas. QuotFooling computadores desde 1971.quot Terça-feira, 30 de setembro de 2014 12:21 Se é um único campo como duplo ou seqüência ou inteiro ele vai funcionar como você disse. Mas eu estou trabalhando com uma estrutura. Ter, 30 de setembro, 2014 2:07 PM Eu tenho cerca de 40 estruturas diferentes. Converter tudo isso seria um trabalho enorme. Na minha pergunta em si o código para converter a estrutura para matriz de bytes é dado. Em qualquer caso colando aqui novamente. Editado por Perichiappan Lakshmanan Terça-feira, 30 de setembro de 2014 2:09 PM Terça-feira, 30 de setembro de 2014 2:08 PM Você está retornando um array de bytes por ref assim que não vai funcionar se ele for colocado no final da função Terça-feira, 30, 2014 2:29 PM Se é um único campo como duplo ou seqüência ou inteiro ele irá funcionar como você disse. Mas eu estou trabalhando com uma estrutura. Isso realmente não importa. Você sabe quantos bytes leva para representar cada campo da estrutura, isso é determinado pelo tipo de dados para a maioria de seus campos e pela constante de tamanho especificada para a seqüência de caracteres. Você também sabe que cada dado de campos está presente na ordem declarada porque você especificou Layout Seqüencial. Portanto, use qualquer um dos métodos propostos para reverter uma matriz de bytes e converter cada subchunk da matriz de bytes global de acordo com cada tamanho de campo. Dado este exemplo de layout: Você deve ser capaz de usar uma rotina algo como isto: Reed Kimble - quotWhen você faz as coisas certas, as pessoas não será certo youve feito nada em allquot Proposta como resposta por dbasnett quarta-feira, 01 de outubro de 2014 10:53 Marcado como resposta por Carl Cai Moderador terça-feira, 7 de outubro de 2014 6:02 Terça-feira, 30 de setembro de 2014 17:11 ltquotegt precisamos converter em Big Endian antes de enviá-lo e também converter o Big Endian para o pequeno Endian depois de recebermos os dados. Ltquotegt Por que você precisa convertê-lo em grande endian enquanto em trânsito É qualquer coisa em trânsito vai precisar de ler esses dados ou entendê-lo Por favor, perdoe-me se isso mostra a minha ignorância completa sobre este assunto. Leon Stanley - Não pague o ferryman - até que ele recebe você para o outro lado. Um. Eu aplico isso às corporações - não a Deus. A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada a você quando você deixar o site Msdn. Você gostaria de participarChanging o formulário Endian de dados numéricos binários Este exemplo demonstra como converter dados numéricos binários para um formulário endian que um aplicativo não criado com LabVIEW pode ler. O LabVIEW armazena números em formato big-endian, com o byte mais significativo primeiro na memória. As aplicações Mac e Sun geralmente esperam que os dados sejam de formato big-endian, mas os aplicativos Windows geralmente esperam forma little-endian, com o byte menos significativo primeiro. Como resultado, para um aplicativo do Windows que requer forma little-endian, você deve explicitamente trocar os bytes em cada número após você aplainar ou antes de unflatten os dados. Se um aplicativo do Windows requer dados binários de dois bytes little-endian, você deve trocar o primeiro byte com o segundo byte em cada número antes de gravar os dados.160 O exemplo VI (anexado) mostra cinco métodos diferentes para converter dados de big - Endian a forma little-endian, ou vice-versa. Nota 160 Os números de ponto flutuante no LabVIEW são compatíveis com IEEE eo aplicativo de destino deve ser capaz de ler esses números. Os números de ponto flutuante de precisão simples e dupla são tipicamente formatados adequadamente, mas os números de precisão estendida, para os quais há vários formatos em uso, podem não ser. Consulte a Nota de Aplicação no LabVIEW Data Storage (link abaixo) para obter mais informações sobre formulários endian. LabVIEW 7.1 e Anterior Quando você altera a forma endian dos dados, não use a opção da função LabVIEW Write File que grava automaticamente um cabeçalho de arquivo. Este cabeçalho é sempre de forma big-endian. Em vez disso, se você precisar de um cabeçalho de tamanho, escreva-o explicitamente antes de gravar dados no arquivo. Você deve saber o formato que o aplicativo de destino espera. Por exemplo, enquanto um aplicativo pode reconhecer um arquivo criado com as funções Gravar em Arquivo I16 ou Gravar em Arquivo SGL com ou sem troca de bytes, ele pode esperar um tipo de cabeçalho que esses VIs não fornecem. Quando você sabe exatamente qual formato o aplicativo espera, use os recursos apropriados no LabVIEW para criar esse arquivo. Eu abri isso no Labview 7.1 sem nenhum problema. Swapping endianess de tipos de dados mistos. - 11.12.2013 Por Dave Taylor, Companhia Hach. Os métodos descritos no exemplo vi são úteis se você estiver trocando itens únicos ou matrizes de um único tipo. Mas se você precisar trocar um tipo de dados misto, como um cluster, isso se tornará extremamente complicado. Uma maneira de lidar com isso (que é certamente inelegant mas um heck de muito mais rápido e automático) é escrever o cluster para um arquivo binário usando big endian e, em seguida, ler esse binário de volta como little endian. Para ver o efeito desse processo, encaixe seu cluster de entrada em uma matriz de U8, faça a mesma coisa com os dados que você lê de volta do pequeno endian. Você verá que todos os tipos de dados de vários bytes foram trocados. Por Nstor Uribe Patarroyo, INTA. O exemplo para download é salvo com Labview 8.1 e, portanto, não pode ser aberto com versões anteriores. Exemplo incompatível - 08.06.2006 Por Steve D, Smiths Aerospace. O exemplo para download não funciona (nem sequer pode ser visto) com Labview 8.0 ou 7.1.Byte Ordem Na computação, dois esquemas básicos de representação de número são usados: Little-Endian e Big-Endian. No esquema little-endian, os valores de vários bytes são armazenados a partir do byte menos significativo para a maioria, e vice-versa no esquema big-endian. Por exemplo, o valor de palavra dupla 0x12345678 será armazenado pelo computador little-endian como: E pelo computador big-endian como: os processadores x86 e x64 usam a codificação little-endian, enquanto alguns outros processadores da Motorolla e IBM usam a codificação big-endian. Hex Editor Neo permite que você altere a ordem de bytes para cada janela de editor individualmente. Tenha em atenção que quaisquer alterações serão visíveis apenas em palavras, palavras duplas e tipos de visualização de quatro palavras. A opção Ordem de byte padrão na página Configurações gerais é usada para definir a ordem de bytes padrão para janelas de editor recém-abertas. Para alterar uma ordem de bytes para a janela aberta, use os comandos disponíveis no menu View Byte Order. Por padrão, a combinação de teclas CtrlE está vinculada ao comando Exibir ordem de byte Little-Endian, enquanto a combinação de teclas CtrlShiftE é vinculada ao comando Exibir ordem de byte Big-Endian. Efeito em tipos de ponto flutuante O padrão de ponto flutuante (IEEE 754) não define codificação exata de tipos de dados de ponto flutuante em computadores little-endian e big-endian. De acordo com o padrão, a codificação não deve ser afetada pela alteração da ordem dos bytes, embora, bytes de tipo de ponto flutuante sejam realmente trocados em várias plataformas big-endian. Hex Editor Neo suporta cenários, onde os tipos de ponto flutuante não são afetados pela ordem de byte big-endian e onde os tipos de ponto flutuante são afetados pela alteração da ordem de bytes. A alteração da ordem Byte afeta a opção de tipos de ponto flutuante na página Configurações gerais controla isso. Essa opção está ativada por padrão. Instrutor de Dados e Visualizador de Estrutura Os módulos Inspetor de Dados e Visualizador de Estrutura também levam em consideração a ordem atual de bytes das janelas quando exibem e processam dados. Copyright 2014 HHD Software. Todos os direitos reservados.

No comments:

Post a Comment