Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

291
Visualizações
Escribir un mensaje de matriz binaria de varios bytes (big endian) (.Net C#)

Estoy tratando de comunicarme con un servidor que se ejecuta localmente en mi máquina. Simplemente no sé cómo escribir el mensaje que espera el servidor. Estoy tratando de hacer esto en una aplicación .Net (C#). Este servidor espera un mensaje de al menos 10 bytes organizado por la siguiente estructura, del manual :

[Manual completo] http://jkca.ca/help/pages/telemetry.html#messageformat

Cada mensaje tiene el mismo formato binario básico. ¡Todos los valores de varios bytes están en orden de bytes de red (big-endian)! El tamaño mínimo del mensaje es de 10 bytes. Los clientes pueden enviar mensajes de solicitud de cliente (consulte la tabla de tipos de mensajes). El servidor responderá con los mensajes de respuesta del servidor correspondientes. El Request ID puede ser asignado libremente por el cliente y no tiene un significado especial. El mensaje de respuesta del servidor utilizará el mismo ID de solicitud en la respuesta correspondiente.

(Parece que no puedo formatear una tabla en esta pregunta, así que estoy omitiendo la tabla que se puede encontrar en el manual)

Me gustaría entender cómo formar estos mensajes. Si alguien pudiera explicarle a un estudiante que no sea de informática cómo formar, por ejemplo, el mensaje para enviar un "comando de pausa" ( http://jkca.ca/help/pages/telemetry.html#msg27 ), sería muy útil.

He probado todo tipo de variaciones de:

 string message = N + "27" + "1000" + "01" + "1" + L; Byte[] data = System.Text.Encoding.BigEndianUnicode.GetBytes(message);

y (que me doy cuenta de que no es binario)

 // N |Type ID(2) | ID (4) |Datasize(2)|Data | L | //Byte[] data = new Byte[] { 0x4E, 0x32, 0x37, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x4C }; // N | 2 | 7 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | L |

y enviar los datos con

 stream.Write(data, 0, data.Length);

Alternativamente, una explicación de cómo solicitar la "versión de software" y cómo leer la respuesta ( http://jkca.ca/help/pages/telemetry.html#msg3 ) podría ser todo lo que necesito para comenzar a comprender cómo hacerlo.

Muchas gracias de antemano.

PD: Encontré este ( https://github.com/bestdani/py_nl2telemetry ) repositorio en python que logra comunicar y recuperar datos de este servidor, pero no puedo seguirlo hasta el punto de entender cómo hacerlo usando .Net. Tal vez sea útil para alguien que elabora una respuesta.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Para ampliar el comentario de Hans, cada letra en un literal de cadena generalmente equivale a un byte. Por ejemplo, A se almacena como 0x41 , B se almacena como 0x42 , 0 se almacena como 0x30 . Busque codificaciones de caracteres ASCII y UTF8 para obtener más información. Cuando escribe una cadena como '1000', luego obtiene los bytes subyacentes, termina con la secuencia 0x31 0x30 0x30 0x30 . El número de bytes aquí es igual al número de dígitos en su cadena. Este es un número de longitud variable y no es una forma muy compacta de almacenar la información, porque en lugar de usar el rango completo de cada byte (00 a FF) para un total de 256 posibilidades por byte, solo usa 10 de los posibilidades (30 a 39). Esta ineficiencia se vuelve más obvia cuando usa números más grandes, por ejemplo, 1000000 ocupa 7 bytes.

El servidor espera la identificación de la solicitud en un formato diferente, int32 , que siempre ocupa 4 bytes. Puede obtener los datos en este formato llamando a BinaryPrimitives.WriteInt32BigEndian(buffer, 1000) . Lo mismo se aplica a la identificación del tipo de mensaje y los campos de tamaño de datos, deben proporcionarse como Int16.

Después de leer la documentación que publicó, parece que los datos esperados para una solicitud de 'Establecer pausa' serían así:

 0x4E 'N' ------------------------ 0x00 Set Pause (27) 0x1B ------------------------ 0x00 Request id (1000) 0x00 0x03 0xE8 ------------------------ 0x00 Data size (1) 0x01 ------------------------ 0x01 Data (Enable pause) ------------------------ 0x4C 'L'
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda