Я не знаю библиотечной функции, чтобы сделать это за один шаг. Однако следующий (по общему признанию, громоздкий) бит кода, который, как я полагаю, выполняет то, что вам нужно (и вы можете обернуть это в свою собственную служебную функцию):
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 );
}
}
То, как вы это сделаете, полностью зависит от того, как вы представляли значение, когда передавали его через 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()
, чтобы преобразовать строку в целое число.