【问题标题】:How do I set 4 bytes bit pattern for magic number in Java?如何在 Java 中为幻数设置 4 字节位模式?
【发布时间】:2011-06-24 06:48:37
【问题描述】:

我正在使用 C++ 在 linux 机器上进行网络编程,我想知道如何在 Java(客户端)中为幻数设置 4 字节位模式。另外,如何在 c++ co 中设置相同的位模式,我可以将来自客户端的位模式与服务器端的位模式进行比较。

提前谢谢..

编辑

所以现在我有了这个

    byte[] signature = new byte[4];

    for(int i=0; i<4; i++){
        signature[i] = (byte) 0xA9;
    }

如果我在调试器的 for 循环之后查看数组的内部,那么我有

{-89, -89, -89, -89}

我在 C++ 中做了类似的事情

    uint8_t m_magicNumberBuffer[4];
    magicKeyRead = read(m_fd, m_magicNumberBuffer, SIZE_OF_HEADER);


    if(m_magicNumberBuffer[0] == 0xA9 && m_magicNumberBuffer[1] == 0xA9 && m_magicNumberBuffer[2] == 0xA9 && m_magicNumberBuffer[3] == 0xA9){
        printf("SocketClient::recvMagicKey, Magic key has been found \n");
        break;
    }

我以某种方式工作,但不确定我已声明 m_magicNumberBuffer 和无符号整数,但它们在 java 中为负 89。这样做可以吗?

提前致谢。

【问题讨论】:

    标签: java c++ linux networking


    【解决方案1】:

    Java 有按位运算符,例如按位 OR |、按位与 &amp; 和位移运算符 &gt;&gt;&gt;、&gt;&gt; 和 &lt;&lt;,与 C++ 的非常相似。您可以使用它们来完全按照您的意愿操作位。

    由于你没有更详细地解释你想做什么,我无法给你更详细的答案。

    【讨论】:

      【解决方案2】:

      在 Java 中,您可以将其表示为

      byte[] signature=new byte[4];
      

      在 C++ 中,它会是

      uint8_t signature[4];
      

      然后,您可以将每个字节作为数组元素单独访问。

      两种语言都支持十六进制代码,例如,你可以这样做

      signature[0]=0xA9;
      

      在 java 或 C++ 中,它会将第一位设置为十六进制的 A9(二进制为 10101001)

      【讨论】:

        【解决方案3】:

        当您写入 DataOutputStream 时,您会写入 8 位字节(符号不重要)

        String filename = "text.dat";
        DataOutputStream dos = new DataOutputStream(new FileOutputStream(filename));
        for (int i = 0; i < 4; i++)
            dos.write(0xA9);
        dos.close();
        
        DataInputStream dis = new DataInputStream(new FileInputStream(filename));
        for (int i = 0; i < 4; i++)
            System.out.println(Integer.toHexString(dis.readUnsignedByte()));
        dis.close();
        

        打印

        a9
        a9
        a9
        a9
        

        Java 假定默认情况下一个字节是有符号的,但它只是 8 位数据,正确使用可以是无符号的,也可以是任何你想要的。

        【讨论】:

          【解决方案4】:

          您真正处理的是四个字节的原始内存;你只是 关心的是位模式,而不是数值。在八 位(Java 中 byte 的大小)、-89 和 0xA9 都具有相同的 位模式:10101001。因为byte 是用Java 签名的,所以转储了 value 将显示一个负值,这是相当反直觉的,但是 Java 没有八位无符号类型。

          (从技术上讲,0xA9 无法在 byte 中表示,并试图将 它在 C++ 中的 signed char 中是非法的。但是Java并不关心 这样的细节。)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-11-10
            • 2015-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-08
            • 2012-12-27
            相关资源
            最近更新 更多