简体   繁体   English

int转换为Java中的无符号char数组

[英]int to unsigned char array in Java

I'm trying to connect Android(Java) with Linux(Qt C++) using socket. 我正在尝试使用套接字将Android(Java)与Linux(Qt C ++)连接。 After that I want to transfer length of message in bytes. 之后,我想以字节为单位传输消息的长度。 For converting int in unsigned char array on the C++ side I use: 为了在C ++端将int转换为unsigned char数组,我使用:

QByteArray IntToArray(qint32 source) 
{
    QByteArray tmp;
    QDataStream data(&temp, QIODevice::ReadWrite);
    data << source;
    return tmp;
}

But I don't know how I can do the same converting on the Java side , because Java hasn't unsigned types. 但是我不知道如何在Java方面进行相同的转换 ,因为Java并非无符号类型。 I tried to use some examples but always got different results. 我尝试使用一些示例,但始终得到不同的结果。 So, I need Java method which returns this for source = 17: 因此,我需要将source = 17返回的Java方法:

0x00 , 0x00 , 0x00 , 0x11 0x00 0x00 0x00 0x11

I understand that it's a very simple question, but I'm new in Java so it's not clear to me. 我知道这是一个非常简单的问题,但是我是Java的新手,所以我不清楚。

UPD: UPD:

Java: Java的:

PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.print(ByteBuffer.allocate(4).putInt(17).array());

Qt C++: Qt C ++:

 QByteArray* buffer = new QByteArray();
 buffer->append(socket->readAll());

Output: 输出:

buffer = 0x5b , 0x42 , 0x40 , 0x61 , 0x39 , 0x65 , 0x31 , 0x62 , 0x66 , 0x35 . buffer = 0x5b0x420x400x610x390x650x310x620x660x35

UPD2: UPD2:

Java: Java的:

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++: same Qt C ++:相同

Output: 输出:

buffer = 0x5b , 0x42 , 0x40 , 0x63 , 0x38 , 0x61 , 0x39 , 0x33 , 0x38 , 0x33 . buffer = 0x5b0x420x400x630x380x610x390x330x380x33

UPD3: UPD3:

Qt C++: Qt C ++:

 QByteArray buffer = socket->readAll();
    for(int i = 0; i < buffer.length(); ++i){
        std::cout << buffer[i];
    }
    std::cout<<std::endl;

Output: 输出:

[B@938a15c [B @ 938a15c

First of all, don't use PrintWriter . 首先,不要使用PrintWriter

Here's something to remember about Java I/O: 关于Java I / O,需要记住以下几点:

  • Streams are for bytes , Readers/Writers are for characters . 流用于字节 ,读取器/ 写入器用于字符
  • In Java, a character is not a byte. 在Java中,字符不是字节。 Characters have an encoding associated with them, like UTF-8. 字符具有与之关联的编码,例如UTF-8。 Bytes don't. 字节不。

When you wrap a Stream in a Reader or a Writer , you are taking a byte stream and imposing a character encoding on that byte stream. 当将Stream包装在ReaderWriter ,您正在获取字节流,并在该字节流上施加字符编码。 You don't want that here. 你不想在这里。

Just try this: 尝试一下:

    OutputStream out = socket.getOutputStream();
    out.write(toBytes(17));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM