我想發送一個Java UUID到C++,它將作爲一個GUID使用,然後將其發送回來並將其視爲一個UUID, m希望只發送16個字節。發送一個Java UUID到C++作爲字節並返回到TCP
任何建議在一個簡單的方法來做到這一點?我有一個複雜的方式,從Java發送到C++,在那裏我要求UUID獲取最少和最重要的位,將它寫入ByteBuffer,然後以字節讀出。
這是我得到2個多頭出UUID的,將它們發送到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);
這工作,但似乎方式太複雜,我還不能在另一個方向上工作。
(我使用谷歌協議緩衝區的兩個多頭來回發送)
- 亞歷
感謝Jon的迴應。所以我嘗試了這種方式,並且將長整型值放回到另一端的GUID中並不容易:) 我的工作方式是單向的,但不是其他方式。我會爲我的問題添加一些代碼。 – 2009-06-28 18:26:15
您不應該在Java端切換長整型的字節順序。你可能不得不在C++端。 – 2009-06-28 18:46:52