gpt4 book ai didi

java - 如何从 Java 通过套接字 C++ 兼容结构发送?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:53 25 4
gpt4 key购买 nike

假设已经有一个已经编写好的、不可更改的主机程序,它通过套接字接收这样的 C++ 结构:

#pragma pack(push, 2)
struct Data {
double x;
double y;
double z;
long frameNumber;
};
#pragma pack(pop)

平台:在 Visual Studio 2008 中编译的 C++/32 位 Windows 应用程序

如何从 Java Socket 发送这样的数据?我尝试用 putDouble() 和 putLong() 填充 ByteBuffer,假设 long 为 32 位,还有 putInt(),但我无法生成有效值。

我也随机生成和发送数据,结构级字节分配看起来不错(我只能随机化一个值,例如 X),但我不能生成精确值(可能不同的双表示?),但只能随机生成通过发送 Math.random() * Double.MAX_VALUE;

我可以只在一侧(客户端生成数据)使用 Google Protocol Buffers 来解决这个问题吗?

记住,我无法更改服务器(接收)端

我知道我可以将数据发送到 C++ 并使用 JNI,但我正在寻找更简单的解决方案。

我在这里看到至少 2 个可能的问题:

  • 字节级的双重表示(比如另一边的 01234567 和 76543210)
  • 一个字节中的位表示(例如另一边的 00000001 和 1000000)

那些东西在 Java 和 C++ 中是什么样子的?

几个小时后,我将提供“字节黑客攻击”的准确示例数据(发送前的准确 Java 值和 C++ 中接收到的 double 值)

关于服务器不良设计应答

我知道这样实现的和不可更改的服务器是糟糕的软件,但这个问题中的环境是将一些数据注入(inject)到“业余水平”的小型旧应用程序

Java 表示

也许这会对某些位级 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

最佳答案

Suppose there is already written, unchangeable host program, that receives such C++ struct by socket

那么你已经遇到了一个主要问题,一些不知名的人好心地把你作为遗产留给了你。您现在必须生成 Java 代码以符合特定 C++ 编译器对特定 struct 的有线格式的概念,这取决于:

  • 硬件
  • 编译器供应商
  • 编译器版本
  • 编译选项
  • 周围的#pragmas
  • ...

强烈建议您借此机会修复整个 megillah 并为交易定义适当的电汇格式。

完成后,您可以使用 DataOutputStream 的工具轻松地模拟它,或者如果问题更糟并且涉及字节序,NIO 加 ByteBuffer。

关于java - 如何从 Java 通过套接字 C++ 兼容结构发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16517355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com