- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的目标是通过网络发送以网络字节顺序以 64 位无符号整数开头的数据报。所以首先我使用宏将数字转换为大端:
#define htonll(x) ((1==htonl(1)) ? (x) : ((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))
#define ntohll(x) ((1==ntohl(1)) ? (x) : ((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))
然后我将它序列化到一个缓冲区中:
unsigned char * serialize_uint64(unsigned char *buffer, uint64_t value) {
printf("**** seriializing PRIu64 value = %"PRIu64"\n", value);
int i;
for (i = 0; i < 8; i++)
buffer[i] = (value >> (56 - 8 * i)) & 0xFF;
for (i = 0; i < 8; i++)
printf("bufer[%d] = %x\n", i, buffer[i]);
return buffer + 8;
}
然后我反序列化它
uint64_t deserialize_uint64(unsigned char *buffer) {
uint64_t res = 0;
printf("*** deserializing buffer:\n");
int i;
for (i = 0; i < 8; i++)
printf("bufer[%d] = %x\n", i, buffer[i]);
for (i = 0; i < 8; i++)
res |= buffer[i] << (56 - 8 * i);
return res;
}
它似乎适用于小整数,但以下测试代码无法正常工作:
uint64_t a = (uint64_t) time(NULL);
printf("PRIu64: a =%"PRIu64"\n", a);
uint64_t z = htonll(a);
uint64_t zz = ntohll(z);
printf("z = %"PRIu64" ==> zz = %"PRIu64" \n", z, zz);
unsigned char buffer[1024];
serialize_uint64(buffer, z);
uint64_t b = deserialize_uint64(buffer);
uint64_t c = ntohll(g);
当我得到
a = 1494157850
htonll(a) = 1876329069679738880 ==> ntohll(htonll(a)) = 1494157850
**** seriializing PRIu64 value = 1876329069679738880
bufer[0] = 1a
bufer[1] = a
bufer[2] = f
bufer[3] = 59
bufer[4] = 0
bufer[5] = 0
bufer[6] = 0
bufer[7] = 0
*********
*** deserializing buffer:
bufer[0] = 1a
bufer[1] = a
bufer[2] = f
bufer[3] = 59
bufer[4] = 0
bufer[5] = 0
bufer[6] = 0
bufer[7] = 0
===> res = 436866905
c = 6417359100811673600
似乎缓冲区没有捕获更大的数字......
最佳答案
你的序列化器本质上是
unsigned char *serialize_u64(unsigned char *buffer, uint64_t value)
{
buffer[7] = value & 0xFF;
value >>= 8;
buffer[6] = value & 0xFF;
value >>= 8;
buffer[5] = value & 0xFF;
value >>= 8;
buffer[4] = value & 0xFF;
value >>= 8;
buffer[3] = value & 0xFF;
value >>= 8;
buffer[2] = value & 0xFF;
value >>= 8;
buffer[1] = value & 0xFF;
value >>= 8;
buffer[0] = value & 0xFF;
return buffer + 8;
}
并序列化value
从 native 字节顺序到网络字节顺序;不需要宏。
所以,它看起来像 OP 的 serialize_uint64()
应该工作得很好。只是根本不应该使用字节顺序宏。
OP 的 deserialize_uint64()
应该投 buffer[i]
至 (uint64_t)
移位前,确保移位结果为64位。就个人而言,我更喜欢将反序列化器编写为
unsigned char *serialize_u64(unsigned char *buffer, uint64_t *valueptr)
{
uint64_t value = buffer[0];
value <<= 8;
value |= buffer[1];
value <<= 8;
value |= buffer[2];
value <<= 8;
value |= buffer[3];
value <<= 8;
value |= buffer[4];
value <<= 8;
value |= buffer[5];
value <<= 8;
value |= buffer[6];
value <<= 8;
value |= buffer[7];
*valueptr = value;
return buffer + 8;
}
如果 OP 使用 res |= ((uint64_t)buffer[i]) << (56 - 8 * i);
,它执行与 OP 相同的操作相反。
同样,序列化器和反序列化器都已经将数据与网络字节序和本地字节序相互转换;根本不应使用字节顺序宏。
关于在C中将64位unsigned int来回转换为char缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43831225/
我正在编写两个程序,一个用 C++ 编写,另一个用 Python 编写,以使用 unix 域套接字相互通信。我想做的是让 C++ 代码向 Python 代码发送一个数字,Python 代码又将另一个数
我希望有一个生成器函数,它返回一条线上的点,给定一个最小距离 k。这很简单,可以使用 numpy 完成,如下所示: points = np.linspace(start, end, k) 但是,我想生
根据我的理解,我们一直在用 Git 做一个非常标准的分支模型的项目,描述如下:http://nvie.com/posts/a-successful-git-branching-model/ 我们从“m
我有一张图片,我想单击它以动画形式旋转 90 度,当它再次单击时我希望它以动画形式旋转 -90 度。 对于使用 css3 变换的旋转 im: -moz-transform:rotate(90deg);
我正在尝试将 拖放 Logo 到 2 个 SVG 圆圈 中。在我的代码的帮助下,图像被拖到一个圆圈中,但没有被拖到另一个圆圈中。 如何修改code这样图像可以在两个圆圈之间拖/放? function
我正在使用 python 3.5.2、pandas 0.18.1 和 sqlite3。 在我的数据库中,我有一个列 unix_time 和 INT 自 1970 年以来的秒数。理想情况下我想从 sql
我已经在我的服务器上安装了 SSL。我的问题是如何通过 acegi 插件在选定的 Controller /页面上强制使用 https。 Acegi 插件支持一个属性 forcehttps,当设置为 t
这是我第一次发布查询。我需要帮助。感谢您的帮助。 我同意我已经把我的概率作为一个长篇故事。但很抱歉,我不知道如何缩短它,我的目的是提供有关我的问题的完整信息。 问题:我必须在 Windows 平台上使
我是一名优秀的程序员,十分优秀!