2011-06-24 16 views
1

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

预先感谢..

编辑

所以现在我有这个

byte[] signature = new byte[4]; 

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

如果我看着阵内后从调试器环路,则我有

{-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。这可以这样做吗?

在此先感谢。

回答

3

Java有位运算符,例如按位或|,位与&和位移位运算符>>>>><<,非常类似于C++有。你可以使用这些来精确地操作位。

既然你没有更详细地解释你想做什么,我不能给你更详细的答案。

1

在Java中,将其表示为

byte[] signature=new byte[4]; 
在C++

,这将是

uint8_t signature[4]; 

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

两种语言都支持十六进制代码,因此,例如,你可以在任何Java或C做

signature[0]=0xA9; 

++,它会设定在十六进制的第一位到A9(这是二进制10101001)

0

当你写一个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位数据,正确使用可以是无符号的或者表示任何你想要的。

0

你真正处理的是四个字节的原始内存;所有你关心的是 是位模式,而不是数值。在八位 位(Java中的byte的大小)中,-890xA9都具有相同的 位模式:10101001。由于byte使用Java语言签名,因此倾销 值将显示负值,这相当直观,但 Java没有八位无符号类型。

(从技术上讲,0xA9不是在byte所能表述的,并试图把它 在signed char在C++中是非法的。但Java不关心 这种细微。)

相关问题