java - 将 Java UUID 作为字节发送到 C++,然后通过 TCP 返回

标签 java c++ networking guid uuid

我正在尝试将 Java UUID 发送到 C++,它将在 C++ 中用作 GUID,然后将其发回并将其视为 UUID,我希望将其发送到只有 16 个字节。

有什么简单的方法可以做到这一点吗?

我有一种复杂的方法,从 Java 发送到 C++,我在其中询问 UUID 的最低和最高有效位,将其写入 ByteBuffer,然后将其作为字节读出。

这是我从 UUID 中获取 2 个 long 并将它们发送到 C++ 的愚蠢复杂的方法:

Java

public static byte[] asByteArray(UUID uuid) 
 {
    long msb = uuid.getMostSignificantBits();
    long lsb = uuid.getLeastSignificantBits();
    byte[] buffer = new byte[16];

    for (int i = 0; i < 8; i++) {
            buffer[i] = (byte) (msb >>> 8 * (7 - i));
    }
    for (int i = 8; i < 16; i++) {
            buffer[i] = (byte) (lsb >>> 8 * (7 - i));
    }

    return buffer;

}




    byte[] bytesOriginal = asByteArray(uuid);
    byte[] bytes = new byte[16];

    // Reverse the first 4 bytes
    bytes[0] = bytesOriginal[3];
    bytes[1] = bytesOriginal[2];
    bytes[2] = bytesOriginal[1];
    bytes[3] = bytesOriginal[0];
    // Reverse 6th and 7th
    bytes[4] = bytesOriginal[5];
    bytes[5] = bytesOriginal[4];
    // Reverse 8th and 9th
    bytes[6] = bytesOriginal[7];
    bytes[7] = bytesOriginal[6];                                 
    // Copy the rest straight up        
    for ( int i = 8; i < 16; i++ )
    {
        bytes[i] = bytesOriginal[i];
    }    

    // Use a ByteBuffer to switch our ENDIAN-ness
    java.nio.ByteBuffer buffer = java.nio.ByteBuffer.allocate(16);
    buffer.order(java.nio.ByteOrder.BIG_ENDIAN);
    buffer.put(bytes);
    buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN);
    buffer.position(0);

    UUIDComponents x = new UUIDComponents();

    x.id1 = buffer.getLong();
    x.id2 = buffer.getLong();

C++

    google::protobuf::int64 id1 = id.id1();
    google::protobuf::int64 id2 = id.id2();

    char* pGuid = (char*) &guid;
    char* pGuidLast8Bytes = pGuid + 8;
    memcpy(pGuid, &id1, 8);
    memcpy(pGuidLast8Bytes, &id2, 8);

这行得通,但似乎太复杂了,我还不能让它在另一个方向上工作。

(我正在使用谷歌 Protocol Buffer 来回发送两个 long)

  • 亚历克斯

最佳答案

我有一些工作。

我没有将它作为两个 long 发送,而是作为字节发送,这是 Java 代码:

public static UUID fromBytes( ByteString byteString)
{
    byte[] bytesOriginal = byteString.toByteArray();
    byte[] bytes = new byte[16];

    // Reverse the first 4 bytes
    bytes[0] = bytesOriginal[3];
    bytes[1] = bytesOriginal[2];
    bytes[2] = bytesOriginal[1];
    bytes[3] = bytesOriginal[0];
    // Reverse 6th and 7th
    bytes[4] = bytesOriginal[5];
    bytes[5] = bytesOriginal[4];
    // Reverse 8th and 9th
    bytes[6] = bytesOriginal[7];
    bytes[7] = bytesOriginal[6];                                 
    // Copy the rest straight up        
    for ( int i = 8; i < 16; i++ )
    {
        bytes[i] = bytesOriginal[i];
    }    

    return toUUID(bytes);
}

public static ByteString toBytes( UUID uuid )
{
    byte[] bytesOriginal = asByteArray(uuid);
    byte[] bytes = new byte[16];

    // Reverse the first 4 bytes
    bytes[0] = bytesOriginal[3];
    bytes[1] = bytesOriginal[2];
    bytes[2] = bytesOriginal[1];
    bytes[3] = bytesOriginal[0];
    // Reverse 6th and 7th
    bytes[4] = bytesOriginal[5];
    bytes[5] = bytesOriginal[4];
    // Reverse 8th and 9th
    bytes[6] = bytesOriginal[7];
    bytes[7] = bytesOriginal[6];                                 
    // Copy the rest straight up        
    for ( int i = 8; i < 16; i++ )
    {
        bytes[i] = bytesOriginal[i];
    }    

    return ByteString.copyFrom(bytes);
}


private static byte[] asByteArray(UUID uuid) 
 {
    long msb = uuid.getMostSignificantBits();
    long lsb = uuid.getLeastSignificantBits();
    byte[] buffer = new byte[16];

    for (int i = 0; i < 8; i++) {
            buffer[i] = (byte) (msb >>> 8 * (7 - i));
    }
    for (int i = 8; i < 16; i++) {
            buffer[i] = (byte) (lsb >>> 8 * (7 - i));
    }

    return buffer;

}

private static UUID toUUID(byte[] byteArray) {

    long msb = 0;
    long lsb = 0;
    for (int i = 0; i < 8; i++)
            msb = (msb << 8) | (byteArray[i] & 0xff);
    for (int i = 8; i < 16; i++)
            lsb = (lsb << 8) | (byteArray[i] & 0xff);
    UUID result = new UUID(msb, lsb);

    return result;
}

这样做,字节可以直接在 C++ 端使用。我想可以在任一端完成字节顺序的切换。

C++

    memcpy(&guid, data, 16);

关于java - 将 Java UUID 作为字节发送到 C++,然后通过 TCP 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1055413/

相关文章:

java - 可以设置JTable的单元格溢出吗?

java - 修改: How to update multiple rows in java jdbc on duplicate value

c++ - 使用 CXX 桥从 C++ 调用 Rust

c++ - Opengl superbible example compliation errors 源代码 : drawing a triangle

java - GWT 编辑器使用 IsEditor<LeafValueEditor<Date>> 填充 Long 字段

c++ - 'context string for the given token' 是什么意思?

linux - 如何构建一个接受数千个持久网络连接的服务器?

networking - 带有 WiFi Shield 的 Arduino 可以使用多播 IP 发送 UDP 消息吗?

ios - 确保在发送其他请求之前完成初始网络请求的最佳方法(iOS 应用程序)

java - OpenCSV - 将多个 CSV 列映射到单个 bean 属性