gpt4 book ai didi

C++ 编码数字

转载 作者:行者123 更新时间:2023-11-28 02:20:38 37 4
gpt4 key购买 nike

我目前正在基于 mod96 编码方案向接收方发送数据。以下是从我这边发送的请求结构:

Field                          Size          Type
1. Message Type 2 "TT"
2. Firm 2 Mod-96
3. Identifier Id 1 Alpha String
4. Start Sequence 3 Mod-96
5. End Sequence 3 Mod-96

我的疑问是序号可以大于3个字节。假设我必须发送数字 123 和 123456 作为开始和结束序列号,如何将其编码为 mod 96 格式。已将查询发送给接收方,但他们尚未回答。有人可以阐明如何以 mod 96 格式对数字进行编码吗?

最佳答案

如果您真正需要的东西缺少很多细节,那么 Mod-96 的工作原理如下:

您只需将可打印字符用作数字即可:

  • 当您以 10 为基数进行编码时,您知道 123 是 10^2*1 + 10^1*2 + 10^0*3

  • (哦,请注意,您任意选择 1 的值确实是一个:value('1') = 1

  • 当您以 96 为基数进行编码时,您知道 123 是

    96^2*value('1')+ 96^2*value('2')+96^0*value('3')

  • 因为 '1' 是 ASCII 字符 #49 那么 value('1') = 49-32 = 17

将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 => 最大 884735 => 需要 17 位存储(值最多 131071 未使用)

您的数据包需要 14+17+17 位内存(即 48 => 恰好 6 个字节)位存储,仅用于 Mod-96 内容。

观察:

  • 我们可以使用一个大小为 (8) 的字段来代替 3 个大小为 (2+3+3) 的字段 => 我们最终会使用 47 位(但仍四舍五入为 6字节)
  • 如果您仍然将每个编码数字存储为整数字节,那么您将使用与直接存储字符相同的内存量(14 位适合 2 个字节,17 位适合 3 个字节)。

关于C++ 编码数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32676731/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com