Как преобразовать байт * полезную нагрузку в int?

Я не знаю библиотечной функции, чтобы сделать это за один шаг. Однако следующий (по общему признанию, громоздкий) бит кода, который, как я полагаю, выполняет то, что вам нужно (и вы можете обернуть это в свою собственную служебную функцию):

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

public class URLTest
{
    public static void main( String[] args ) throws MalformedURLException
    {
        // make a test url
        URL url = new URL( "http://stackoverflow.com/questions/10159186/how-to-get-parent-url-in-java" );

        // represent the path portion of the URL as a file
        File file = new File( url.getPath( ) );

        // get the parent of the file
        String parentPath = file.getParent( );

        // construct a new url with the parent path
        URL parentUrl = new URL( url.getProtocol( ), url.getHost( ), url.getPort( ), parentPath );

        System.out.println( "Child: " + url );
        System.out.println( "Parent: " + parentUrl );
    }
}
0
задан Ahmed 17 March 2019 в 23:37
поделиться

1 ответ

То, как вы это сделаете, полностью зависит от того, как вы представляли значение, когда передавали его через MQTT.

Если вы передали его в двоичном формате - например, вы опубликовали целое число в виде серии байтов - тогда вам также необходимо знать порядок байтов и количество байтов. Скорее всего, это сначала младший байт (поэтому, если целое число в шестнадцатеричном формате было 0x1234, оно передавалось бы как два байта - 0x34, а затем 0x12) и 32 бита.

Если вы передаете двоичный файл между двумя одинаковыми компьютерами, работающими под аналогичным программным обеспечением, то с вами, вероятно, все будет в порядке (если это никогда не изменится), но если компьютеры различаются или программное обеспечение отличается, вы имеете дело с представлениями вашего целое число, которое будет зависеть от используемой вами платформы. Даже использование разных языков на двух концах может иметь значение - Python может представлять одно целое число, а C - другое, даже если они работают на идентичных процессорах.

Таким образом, если вы передаете в двоичном формате, вы действительно должны выбрать машинно-независимое представление.

Если бы вы передавали в двоичном виде и не пытались сделать машинно-независимое представление, код был бы что-то вроде:

byte *payload;
int payload_length;
int result;

if(payload_length < sizeof(int)) {
    HANDLE THIS ERROR
} else {
    result = *(int *)payload;
}

Это проверяет, чтобы убедиться, что имеется достаточно байтов для представления двоичного целого числа и затем использует приведение для извлечения целого числа из полезной нагрузки.

Если вы передаете в двоичном формате в машинно-независимом формате, вам нужно будет выполнить любое преобразование, необходимое для принимающей архитектуры.

Я действительно не рекомендую передавать в двоичном формате, если вы не знаете, что делаете, и не имеете веских причин для этого. Большинство приложений сегодня будут нормально передаваться в виде текста, который можно назвать машинно-независимым представлением.

Наиболее вероятной альтернативой передаче в двоичном виде является текст, который может быть машинно-независимым форматом. Если вы передаете целое число в виде текста, ваш код будет выглядеть примерно так:

byte *payload;
int payload_length;
char payload_string[payload_length + 1];
int result;

memcpy(payload_string, payload, payload_length);
payload_string[payload_length] = '\0';
result = atoi(payload_string);

Этот код использует временный буфер для копирования полезной нагрузки. Нам нужно обрабатывать полезную нагрузку как строку C, а строки C имеют дополнительный байт в конце - '\ 0' - который указывает конец строки. В полезной нагрузке для этого нет места, и индикатор конца строки может или не может быть отправлен как часть полезной нагрузки, поэтому мы гарантируем, что он есть, скопировав полезную нагрузку и добавив ее.

После этого просто вызвать atoi(), чтобы преобразовать строку в целое число.

0
ответ дан John Romkey 17 March 2019 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: