- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在编写一个 C++ 程序,我想在其中从 TCP/IP 套接字读取数据流。数据由几个不同长度和数据类型的数据包组成,但是,它们都是以十六进制格式接收的。在此图中可以看到数据包的长度及其数据类型: .我想将接收到的十六进制格式数据转换回数据包各自的原始数据类型。
我在 Python 中找到了一种相当简单的方法:
- 根据已知长度接收每个数据包
- 将它们编码为十六进制
- 根据数据类型解压它们
这是一个示例:
import socket
import struct
HOST = "192.168.0.25" # The remote host
PORT_30003 = 30003
while (True):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT_30003))
print ""
packet_1 = s.recv(4)
packet_2 = s.recv(8)
packet_3 = s.recv(48)
packet_4 = s.recv(48)
packet_5 = s.recv(48)
packet_6 = s.recv(48)
packet_7 = s.recv(48)
packet_8 = s.recv(48)
packet_9 = s.recv(48)
packet_10 = s.recv(48)
packet_11 = s.recv(48)
packet_1 = packet_1.encode("hex")
messageSize = struct.unpack('!i', packet_1.decode('hex'))[0]
print "messageSize = ", messageSize
packet_2 = packet_2.encode("hex")
Time = struct.unpack('!d', packet_2.decode('hex'))[0]
print "Time = ", Time
我不太关心接下来的这些数据包,所以我会跳到相关的数据包(从 packet_12 开始)。我要把每个 48 字节的数据包拆分成更小的 8 字节大小的数据包,因为 48 字节实际上是 6 个独立的值,如上图所示...
packet_12x = s.recv(8)
packet_12x = packet_12x.encode("hex")
x = struct.unpack('!d', packet_12x.decode('hex'))[0]
print "X = ", x * 1000
packet_12y = s.recv(8)
packet_12y = packet_12y.encode("hex")
y = struct.unpack('!d', packet_12y.decode('hex'))[0]
print "Y = ", y * 1000
# And so on.....
这会产生消息长度(应始终为 1108)、服务器时间和机器人工具的 X、Y 位置。
在 C++ 中尝试此操作时,我对数据类型、字节顺序等感到有点困惑。我设法正确生成了第一个数据包(如我所料打印 1108)。但是,下一个数据包与 Python 实现的输出不匹配。这是我拥有的:
connectTcpClient("192.168.0.25");
// This works as expected
int buffer1;
recv(sock, &buffer1, 4, 0);
buffer1 = ntohl(buffer1);
// Prints "messageSize = 1108"
std::cout << "messageSize = " << buffer1 << std::endl;
// This does not produce the same result as the Python code
// When trying with a unsigned long long int instead of double
double buffer2;
recv(sock, &buffer2, 8, 0);
buffer2 = ntohl(buffer2);
// This prints "Time: 0"
std::cout << "Time: " << buffer2 << std::endl;
如果我改为尝试声明我的 buffer2
:unsigned long long int buffer2
我得到了更接近我想要的东西,但它当然不像我期望的那样是双倍的。将 buffer2
转换为 double
只会导致 0。
我希望时间类似于 1379408.432,而不是整数。来自 packet_12 的 X、Y 和 Z 坐标也应该是 double 值。
最佳答案
ntohl
函数需要一个 32 位整数并更改值以便有效地交换字节,假设主机字节顺序是小端。它不适用于 double
类型的值。
您需要将值读入大小为 8 的 char
数组,反转字节,然后使用 memcpy
将字节复制到 double
.
int i;
unsigned char dbuff[sizeof(double)];
recv(sock, dbuff, sizeof(dbuff), 0);
if (ntohl(0x12345678) == 0x78563412) {
for (i=0; i<sizeof(double)/2; i++) {
unsigned char tmp = dbuff[i];
dbuff[i] = dbuff[sizeof(double)-1-i];
dbuff[sizeof(double)-1-i] = tmp;
}
}
double val;
memcpy(&val, dbuff, sizeof(double));
请注意,这取决于发送方和接收方对 double
具有相同的表示。
关于c++ - 如何正确转换也是不同数据类型的各种(已知)长度数据包的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55497366/
将此矩阵视为一个内存。 p00 p01 p02 p03 p04 p05 p06.... p0n
一般,您如何确定如何根据已知模式迭代数组? 具体,这是我想要迭代的模式,返回一个数组数组:(每个数字都是原始数组的索引值:[0, 1, 2, 3] ) 0 0,1 0,1,2 0,1,2,3 1 1,
问题: 我正在编写一个 C++ 程序,我想在其中从 TCP/IP 套接字读取数据流。数据由几个不同长度和数据类型的数据包组成,但是,它们都是以十六进制格式接收的。在此图中可以看到数据包的长度及其数据类
使用 VC12(在 Visual Studio 2013 RTM 中)[1] 编译此程序会导致崩溃(在所有构建配置中),而实际上它不应该: #include void foo(std::string
我有一个 Snakemake 规则,适用于数据存档并本质上解压其中的数据。文件包含我在规则开始之前知道的不同数量的文件,因此我想利用它并执行类似的操作 rule unpack: input:
有这样的 list 吗? 我对 iOS 开发比较陌生,我认为研究最知名的编译器错误或陷阱列表会很棒。 编辑: 今天我花了太多时间来理解这样的代码发生了什么: 在 *.h @interface I :
如何选择已知 div 中的最后一个子元素,其中该子元素是未知元素。即:元素可以是段落或无序列表。 大多数情况下结构是: Text 但在其他情况下,结构将是: Text More Text
我想绘制以下内容: x = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'] y = [10, 20, 1, 8, 7, 2, 3, 7, 11] 作为条形图
关于未知列表的排序问题,人们已经知道很多了。但是,在堆栈机器中找到已知列表的最佳排序问题呢?也就是说,假设您有以下堆栈计算机: [4,1,3,2] [] [] 也就是说,有3个堆栈的空间,其中1个堆栈
正如主题中所写,我必须使用 mechanize 更改某些输入字段的值,但我没有它的名称只有 id:/让我们坚持这一点。 表单是这样的:
我只是回想起我的大学类(class),想知道这里是否有人在专业环境中使用过“Z 符号”。老实说,这是我一生中参加过的最无聊的类(class)。也许是因为老师,但当时我们真的都认为这是浪费时间。我可能错
我正在尝试编写一个函数来获取 Windows 等效的 HOME。我的 C 技能生疏了,所以请不要介意我的示例代码无法编译。我试图在 Windows Vista 和更新版本上使用 SHGetKnownF
我想找到一个正整数矩阵B,使得AB = BC,其中A和C是具有共同特征值的正整数矩阵。对于这种情况,存在解,但不唯一;我只需要一种解决方案。 有人知道 python 或 matlab 中可以执行此操作
如果您有两个二进制 blob,x 和 y。然后将它们散列在一起,假设使用 SHA-512。入侵者知道 y,这会使反转哈希变得容易多少? 是否有关于 y 有多大并且可以与 x 比较才成为问题的指南?这有
我正在使用Angular-Stripe-Checkout library创建像这样的 stripeToken example 。一些亮点如下所示。 与许多 Angular-stripe 库和示例一样,
我有一个带有 (e,n) 加密数据的公钥,必须通过 RSA 获取纯文本,并且所有这些都在 C 中! 首先我想知道如何找出我的 p 和 q 是什么?我知道它们必须是质数和 p<>q! 最佳答案 首先,因
表1(客户表) Id, CustomerId, IsKnownCustomer,phonemacaddress 1, 空 0 00:9a:34:cf:a4 2, 004024 1 00:6f:64:c
问题是找到第 n-th Catalan 数 mod m,其中 m 是 NOT prime , m = (10^14 + 7)。以下是我尝试过的方法列表:(max N = 10,000) 查表的动态编程
每当我打开我的应用程序时,我都想将我的应用程序连接到一个已知的 wifi 网络/ssid。即使手机当前通过 3G 或任何其他 wifi 网络连接。 仅使用 phonegap/html5 是否可行? 最
我正在做一个项目,我想为特定的用户组(具有管理员角色)实现实时通知,经过一些研究,我明白我需要 session 才能知道哪些用户已登录(默认情况下他们是匿名的)。 另外,我只需要向特定用户发送通知。
我是一名优秀的程序员,十分优秀!