【发布时间】:2021-06-30 04:07:33
【问题描述】:
我正在尝试找到一种方法通过网络发送一个长度为 16 位(短)的值,而其原始值由 32 位长度(整数)确定。
这个想法是通过压缩/解压缩客户端和服务器通信的值来尽可能地节省通过网络的流量大小。
我正在考虑获取整数值并将其位向右移动,在客户端它将它们向左移动。但是,当左边的 16 位丢失时,这不会带来准确的结果。
我不太熟悉压缩/解压缩算法,但我感觉这是可能的。
代码示例:
#include <stdio.h>
void printBits(size_t const size, void const * const ptr)
{
unsigned char *b = (unsigned char*) ptr;
unsigned char byte;
int i, j;
for (i = size-1; i >= 0; i--) {
for (j = 7; j >= 0; j--) {
byte = (b[i] >> j) & 1;
printf("%u", byte);
}
}
puts("");
}
////////////////////////////////////////
short Server(int value) {
return value >> 3;
}
int Client(short value) {
return value << 3;
}
int main()
{
int value = 150000;
printBits(sizeof(value), &value);
printf("Before=%d, After=%d", Server(value), Client(Server(value)));
return 0;
}
这带来了预期的结果,但是当通过从整数到短的转换从左侧剥离相关位时将不准确。
也许可以通过对这些值进行异或运算或对位进行不同的操作方式。我感觉它永远不会精确,但我的目标是尽可能接近原始结果。
【问题讨论】:
-
short Server(int value) { if (value > numeric_limits<int>::max()) throw "oopsies"; if (value < numeric_limits<int>::min()) throw "oopsies"; return static_cast<short>(value); } -
如果您发送的值不适合 16 位整数,那么您需要发送 32 位整数。要么先发送一个长度字节。
-
现在你要发送很多数据;如果您发送的数据包大小小于默认数据包大小(约 1.4k),那么您还有剩余空间吗?
-
显然您将发送大量此类数据,否则节省的费用不会很大。这些整数代表什么?它们是独一无二的吗?有很多重复吗?只有在利用数据的某些属性时,才能设计出有意义的压缩。 (除了先将整个数据包拉上拉链。)
-
很明显,您不能在 16 位中存储 32 位值而不会丢失或无法表示某些值。一个 16 位无符号整数可以存储 0 到 65536 之间的值。你不能神奇地增加 16 位中的信息量。
标签: c++ c network-programming bit-manipulation