我有一条消息
static int[] message = {
0x01, 0x10, 0x00,
0x01, // port addres 01 - 08
0x00, 0x01, 0x02,
0x06, 0x00,
0xA4, 0x21
};
我知道数据是正确的,因为我用RXTX将它们写入COM端口,我得到了正确的硬件反应
我知道0x01
的值是1
,并且发送的确非常像01
(两位,四分之一字节长)
当我需要调整消息时,正在生成这样的值吗?
message[index] = 1 & 0xff
我看到了此代码段的输出,看起来正确
for (int i = 0; i < 255; i++) {
System.out.println(i & 0xff);
}
是否有任何表格建议我阅读?
将这些数字存储在int
右侧,因为我们无法将byte (-128, +127)
用于最大<0x00, 0xFF>
范围的值
答案 0 :(得分:4)
您可能希望将ByteBuffer
用于所需内容,并将其包装在一个类下。
我不知道你确切的消息格式,但是我们暂时说这是3个字节的数据和1个字节的端口:
public final class Message
{
private static final MESSAGE_SIZE = 4;
private static final PORT_OFFSET=3;
private final ByteBuffer buf;
public Message()
{
buf = ByteBuffer.allocate(MESSAGE_SIZE);
}
public void setPort(final byte b)
{
buf.put(PORT_OFFSET, b);
}
// etc
public byte[] getRaw()
{
return buf.array();
}
}
你甚至可以使用ByteBuffer的hashCode()和equals()来比较消息,如果你只使用绝对的get / put方法,那么(否则就会有相当多的体操)。
我使用这种技术来读/写NRPE数据包。
答案 1 :(得分:2)
我知道0x01是1值,并且发送真的像01(这是两位)
如果你正在采取措施实现这一目标,那就是真的。 Java int
是32位值(reference)。仅仅因为该值不需要所有这些位并不意味着它们不被发送,因为可能需要所有位用于不同的值。您发送的内容的大小可能会受到发送方式的限制,但鉴于您引用的其他值,您可以确定至少发送了八个位。
如果您使用OutputStream#write
,发送的内容将完全取决于具体实施。 OutputStream
是一个抽象类,用于定义写入流的语义;它没有定义流本身。需要一个具体的子类来实际定义所写的内容。 FileOutputStream
和ByteArrayOutputStream
以及PipedOutputStream
都会以不同方式输出数据。