Giả sử có đã được viết, chương trình máy chủ không thể thay đổi, tiếp nhận như vậy ++ struct C bằng ổ cắm:Làm thế nào để gửi cấu trúc tương thích socket C++ từ Java?
#pragma pack(push, 2)
struct Data {
double x;
double y;
double z;
long frameNumber;
};
#pragma pack(pop)
nền tảng: C++/32-bit Windows Application biên soạn trong Visual Studio 2008
Làm thế nào để gửi dữ liệu như vậy từ Java Socket? Tôi đã có ý định điền vào ByteBuffer với putDouble() và putLong(), cũng putInt() giả sử dài 32 bit, nhưng tôi không thể tạo ra các giá trị hợp lệ.
Tôi cũng đã tạo và gửi dữ liệu ngẫu nhiên và phân bổ byte cấp cấu trúc có vẻ tốt (tôi có thể ngẫu nhiên chỉ một giá trị, ví dụ X), nhưng tôi không thể tạo giá trị chính xác (đại diện kép khác nhau)? công cụ ngẫu nhiên bằng cách gửi Math.random() * Double.MAX_VALUE;
Tôi có thể sử dụng Bộ đệm giao thức của Google trên một mặt (dữ liệu khách hàng sản xuất) để giải quyết vấn đề này không?
nhớ, tôi không thể thay đổi máy chủ (nhận) bên
tôi biết rằng tôi có thể di chuyển gửi dữ liệu đến C++ và sử dụng JNI, nhưng tôi đang tìm kiếm giải pháp đơn giản hơn.
tôi thấy ít nhất 2 vấn đề có thể ở đây:
- đại diện đôi ở byte cấp cao (nhưvà 76.543.210 vào phía bên kia)
- bit đại diện trong một byte (như 00000001 và 1000000 vào phía bên kia)
Những thứ đó trông như thế nào trong Java trong C++?
Trong vài giờ tôi sẽ cung cấp dữ liệu mẫu chính xác cho "byte-hack" (chính xác giá trị Java trước khi gửi và giá trị nhận được gấp đôi trong C++)
Về máy chủ xấu thiết kế trả lời
tôi biết rằng máy chủ được thực hiện và không thể thay đổi đó là phần mềm xấu, nhưng môi trường trong vấn đề này là tiêm một số dữ liệu vào ứng dụng cũ nhỏ ở mức "hobbistic-level"
Biểu diễn Java
Có lẽ điều này sẽ giúp một số bit cấp chuyên gia C++:
Long.toBinaryString(Double.doubleToRawLongBits((double) 0));
// 000000000000000000000000000000000000000000000000000000000000000
Long.toBinaryString(Double.doubleToRawLongBits(1));
// 011111111110000000000000000000000000000000000000000000000000000
Long.toBinaryString(Double.doubleToRawLongBits(1.1));
// 011111111110001100110011001100110011001100110011001100110011010
Long.toBinaryString(Double.doubleToRawLongBits(1024));
// 100000010010000000000000000000000000000000000000000000000000000
Long.toBinaryString(Double.doubleToRawLongBits(1024.1024));
// 100000010010000000000000110100011011011100010111010110001110001
Long.toBinaryString(Double.doubleToRawLongBits(Double.MAX_VALUE));
// 111111111101111111111111111111111111111111111111111111111111111
không phải lo lắng về máy chủ không thể thay đổi. Điều này rất phổ biến xảy ra và thường không đáng để thử và sửa chữa. Trong lập trình sở thích, bạn luôn có thể thay đổi mọi thứ bất cứ khi nào bạn muốn. Tuy nhiên, chuyên nghiệp, tất cả các quy tắc đều thay đổi. – xaxxon
@killer_PL, cách sử dụng JNI để chuyển đổi các loại Java sang các loại VC++? – megabyte1024
@ megabyte1024, ý tưởng hay, tôi sẽ tìm nó trong trường hợp xấu nhất, nhưng bây giờ tôi sẽ đợi một số giải pháp đơn giản hơn –