Java十六进制

时间:2012-01-08 11:17:29

标签: java hex

我有一条消息

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>范围的值

2 个答案:

答案 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是一个抽象类,用于定义写入流的语义;它没有定义流本身。需要一个具体的子类来实际定义所写的内容。 FileOutputStreamByteArrayOutputStream以及PipedOutputStream都会以不同方式输出数据。