我尝试使用socket连接Android(Java)和Linux(Qt C ++)。之后我想以字节为单位传输消息长度。为了在C ++端转换无符号字符数组中的int,我使用:
QByteArray IntToArray(qint32 source)
{
QByteArray tmp;
QDataStream data(&temp, QIODevice::ReadWrite);
data << source;
return tmp;
}
但我不知道我如何在Java端进行相同的转换,因为Java没有无符号类型。我尝试使用一些例子但总是得到不同的结果。所以,我需要Java方法,它为source
= 17:
0x00
,0x00
,0x00
,0x11
我知道这是一个非常简单的问题,但我是Java新手,所以我不清楚。
UPD:
爪哇:
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.print(ByteBuffer.allocate(4).putInt(17).array());
Qt C ++:
QByteArray* buffer = new QByteArray();
buffer->append(socket->readAll());
输出:
buffer
=0x5b
,0x42
,0x40
,0x61
,0x39
,0x65
,0x31
,0x62
,0x66
,0x35
。
UPD2:
爪哇:
out.print(toBytes(17));
...
byte[] toBytes(int i)
{
byte[] result = new byte[4];
result[0] = (byte) (i >> 24);
result[1] = (byte) (i >> 16);
result[2] = (byte) (i >> 8);
result[3] = (byte) (i /*>> 0*/);
return result;
}
Qt C ++:相同
输出:
buffer
=0x5b
,0x42
,0x40
,0x63
,0x38
,0x61
,0x39
,0x33
,0x38
,0x33
。
UPD3:
Qt C ++:
QByteArray buffer = socket->readAll();
for(int i = 0; i < buffer.length(); ++i){
std::cout << buffer[i];
}
std::cout<<std::endl;
输出:
[B @ 938a15c
答案 0 :(得分:2)
首先,请勿使用PrintWriter
。
以下是关于Java I / O的一些事项:
当您将Stream
包裹在Reader
或Writer
中时,您将获取字节流并对该字节流强制执行字符编码。你不想在这里。
试试这个:
OutputStream out = socket.getOutputStream();
out.write(toBytes(17));