我已经用Java编写了PAHO客户端MQTT程序,并使用了mosquitto-broker。
发布者代码段:发布者发送的数字从0到254。
char[] charset = new char[255];
for(int i=0;i< 255;i++)
{
charset[i] = (char)i;
System.out.println(i+" "+(int)charset[i]);
}
String str2 = String.valueOf(charset);
MqttMessage message1 = new MqttMessage();
message1.setPayload(str2.getBytes());
client.publish("temperature",message1);
订户代码段: 预计订户将收到0到254之间的数字。
byte[] ascii = message.getBytes();
for (int i = 0; i <ascii.length; i++)
{
System.out.println(i +" "+(long)(ascii[i] & 0xFF));
}
输出快照: Publisher output
订户输出中的问题:
订户输出中从128到159的索引正在接收值'63',而不是 从发布商方发送的正常号码。
答案 0 :(得分:2)
为什么不使用字节数组
发布者
byte[] payload = new byte[255];
for(int i = 0; i < 255;i ++) {
payload[i] = (byte)i;
}
message.setPayload(payload);
client.publish("temperature", message);
订户
byte[] paylaod = message.getPayload();
for (int i = 0; i < payload.length; i++) {
System.out.println(i +" "+(int)(payload[i] & 0xFF));
}
但是问题主要与Java如何编码String char
是16位UTF-16编码字符有关。字符串是“具有附加功能的字符数组”。
因此,如果您调用String#getBytes()
,则UTF-16数据将转换为UTF-8,这将导致数据丢失。字符串不能用于承载二进制数据