- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 C 程序,它通过套接字在 UDP 数据包中从大型机接收数据。 C 程序的主机正在从 Unix(大端)更改为 Linux(小端),程序不再运行。我目前没有更改大型机客户端程序的选项。
程序执行recvfrom
并将数据接收到char 数组中。以前我们能够简单地将此缓冲区转换为与从 MF 传递的内容相匹配的结构,并且一切正常。现在,由于不同的字节对齐方式,到结构的映射失败了。这是结构和一些代码。
struct CCClntPkt
{
unsigned short packet_type;
unsigned short reply_socket;
unsigned long msg_ID;
unsigned short msg_length;
unsigned char client_string[250];
};
之前用于将接收到的数据缓冲区转换为该结构的代码如下所示:
char BCpacket_in[MAX_PACKET];
struct CCClntPkt *pClntPkt;
<snip>
rcv_cnt = recvfrom(BCServerSocket, BCpacket_in,
sizeof(BCpacket_in),0x0,(struct sockaddr *)&from,
&fromlen);
if (rcv_cnt > 0)
{
pClntPkt = (struct CCClntPkt *) &BCpacket_in;
}
我能够通过使用 ntohs
获得 packet_type 和 reply_socket 的正确值,但字符字段 client_string 被破坏了。我还尝试在结构之前放置一个 pragma pack(1)
,在结构之后放置一个 pragma pack(0)
,但似乎仍然存在对齐问题。
我还尝试了 BCpacket_in
的位移值,并且能够获得 packet_type 和 reply_socket 的正确值,但无法弄清楚如何提取 ulong msg_ID。代码是:
packet_type = BCpacket_in[0] << 8;
packet_type |= BCpacket_in[1];
reply_to_socket = BCpacket_in[2] << 8;
reply_to_socket |= BCpacket_in[3];
/*
msg_ID = BCpacket_in[4] << 24;
msg_ID |= BCpacket_in[5] << 16;
msg_ID |= BCpacket_in[6] << 8;
msg_ID |= BCpacket_in[7];
*/
在这一点上我很困惑,所以感谢任何帮助。我不是这个程序的原作者,我的 C 知识非常有限。不过,我不介意做这项工作,所以如果能提供任何相关引用资料,我将不胜感激。谢谢!
最佳答案
您必须手动将接收到的数据包 (BCpacket_in
) 解析为 struct CCClntPkt
数据包,这是唯一可移植的方法。 ntohl
(network-to-host long
) 函数族正确处理字节顺序转换;请参阅联机帮助页 byteorder(3)
和 endian(3)
。
这些函数假定所有数据包都作为大端字节序通过网络发送,因为这是互联网标准。
关于c - Little Endian系统中Big Endian系统发送的结构数据的反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4958624/
this post完美地描述了我的原始问题:我想遵循TDD: 写一个小测试 观看失败 写足够的代码使它成功 观看成功 重复 我正在IntelliJ中从事Grails项目。如果我只想编写普通的JUnit
据我所知,little-oh 应该有一个接近无穷大的 n 的极限(函数/little-oh,omega 函数)= 0,对于 little omega,极限应该等于无穷大。但是,是否有可能存在多个 li
您好,我目前正在使用 Little Man Computer对于一个学校项目,我知道 LMC 有一个 ADD 和一个 SUB 功能。但是我知道 LMC 中没有乘法或除法函数,我想知道为什么会这样。 最
little-oh 和 little Omega 符号的用途/目的是什么? 尽管我完全理解符号本身及其代表的含义。我还没有看到任何一本书或算法在任何计算中使用它们,所以我不禁想知道如果不使用它们,为什
我正在阅读“小计划者”,以更好地理解编程的某些核心元素(即递归),并获得更多关于如何像程序员一样思考的想法。 这本书被推荐作为入门级书籍,并且在引言中指出,我所需要知道的只是英文,数字和计数(我会这样
考虑以下 s 表达式: ((lambda (car) (car (quote (a b c)))) cdr) 在我尝试过的大多数方案实现中,计算结果为 (b c)因为cdr传递给 lambda,将其命
我的目标是拥有一个在后台运行的服务,并以指定的时间间隔(例如每 10 分钟)将我的设备位置发送到远程服务器。我正在尝试使用 Little Fluffy Location Library 来优化电池生命
我刚刚学习了 Python (3.x),但我一直在将十六进制字符串转换为 float 。我有这个十六进制字符串值:'0x22354942F31AFA42CE6A494311518A43082CAF43
所以,我可以理解为 0x1234 的一个字,当存储为 little-endian 时,在内存中变为 0x3412。我还看到字节 0x12 作为位域 a:4,b:4 将存储为 0x21。但是,如果我有更
我有一个 C 程序,它通过套接字在 UDP 数据包中从大型机接收数据。 C 程序的主机正在从 Unix(大端)更改为 Linux(小端),程序不再运行。我目前没有更改大型机客户端程序的选项。 程序执行
我正在使用 PulseAudio API“实时”获取当前麦克风输入。缓冲区数据作为 16 位小端字节数组传送。我想做的是找出缓冲区中的最大峰值电平并将其转换为分贝值。为此,我必须将每两个字节数组值转换
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
这个问题在这里已经有了答案: Difference between Big-O and Little-O Notation (5 个答案) 关闭 8 年前。 直观上,nb = o(an)(o 是小哦
我正在使用 file.readAsBytes()。但它只提供List来接收数据。我正在尝试 Uint8List 但没有用。 最佳答案 readAsBytes将为您提供字节列表。它可能是一个 Uint8
我想快速了解 F# 并且想知道“The Little ML'er”这本书是否会有所帮助,因为 F# 基于 OCaml,它是 ML 的衍生物。或者,ML 与 F# 的差别太大而没有任何帮助吗? 谢谢。
将小端系统中的数据转换为网络字节顺序所需的底层转换是什么?对于2字节和4字节数据,有众所周知的函数(如htons,ntohl等)来封装变化,1字节数据的字符串(如果有的话)会发生什么? 此外,维基百科
我很难理解 The Little Schemer 的 evens-only*&co 发生了什么事情第 145 页的示例。 这是代码: (define evens-only*&co (lambda (
在从SICP学习了一些Scheme之后,我开始阅读The Little Schemer(我觉得很有趣),并且完成了大约四分之一。我注意到,无需使用lambda即可编写许多(大多数?全部?)解决方案,而
我正在尝试了解计算机的实际工作原理,我找到了一些模拟器软件,但它们似乎非常复杂(我还是个初学者)。我看到了Little Man Computer (LMC)这是很旧的。恐怕软件的工作方式与现在完全不同
我正在尝试了解计算机的实际工作原理,我找到了一些模拟器软件,但它们似乎非常复杂(我还是个初学者)。我看到了Little Man Computer (LMC)这是很旧的。恐怕软件的工作方式与现在完全不同
我是一名优秀的程序员,十分优秀!