提供有很多关于你真正需要的丢失的细节,这里是如何工作的MOD-96 econding:
你只需要使用打印的字符,如果他们有大量数字:
编码3个的可打印字符为多个
unsigned int encode(char a, char b, char c){
return (a-32)*96*96 + (b-32)*96 + (c-32);
}
将2个可打印字符编码成数字
unsigned int encode(char a, char b){
return (b-32)*96 + (c-32);
}
解码的数为2个可打印的字符
void decode(char* a, char*b, unsigned int k){
* b = k % 96 +32;
* a = k/96 +32;
}
解码的数为3个可打印的字符
void decode(char* a, char*b, char*c, unsigned int k){
* c = k % 96 +32;
k/= 96;
* b = k % 96 +32;
* a = k/96 +32;
}
也当然需要检查字符是可打印的(32和127之间包括在内),你打算解码的数字小于9216(对于2个字符编码)和884736(对于3个编码的字符)。
你知道最终尺寸将是6个字节:
- 尺寸2
=>
最大的9215 =>
需要14个比特存储(值高达16383未使用的)
- 尺寸最大的3 需要17比特存储(值高达131071未使用的)
你的数据包需要的存储器14 + 17 + 17位(至极是48 =>恰好6字节)位存储只为MOD-96的东西。
观察:
- 而不是大小的3场(2 + 3 + 3)我们也可以用大小的一个领域(8)
=>
我们终于可以用47位(但仍四舍五入最多6个字节)
- 如果仍然将每个编码数字存储为整数个字节,则可以使用直接存储字符所使用的相同内存量(14位适合2个字节,17位适合3个字节)。
我会说他们将不得不专门解释他们希望如何编码,我不认为“模96”是任何通常使用的格式。 96^3将是884736,所以下面的数字至少应该是可编码的。 –
它使用ASCII设置的可打印范围。 32-127有96个字符。你将不得不抵消价值32以获得它的可打印范围内,并删除抵消重组的数字 – cup
可以请你提供一个例子...我是新来的! – chetan