2015-09-20 64 views
0

我目前正在根据mod96编码方案向接收方发送数据。以下是请求结构从我身边发送:C++编码号码

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格式的数字。

+0

我会说他们将不得不专门解释他们希望如何编码,我不认为“模96”是任何通常使用的格式。 96^3将是884736,所以下面的数字至少应该是可编码的。 –

+0

它使用ASCII设置的可打印范围。 32-127有96个字符。你将不得不抵消价值32以获得它的可打印范围内,并删除抵消重组的数字 – cup

+0

可以请你提供一个例子...我是新来的! – chetan

回答

2

提供有很多关于你真正需要的丢失的细节,这里是如何工作的MOD-96 econding:

你只需要使用打印的字符,如果他们有大量数字:

  • 时你在基地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 需要17比特存储(值高达131071未使用的)

你的数据包需要的存储器14 + 17 + 17位(至极是48 =>恰好6字节)位存储只为MOD-96的东西。

观察:

  • 而不是大小的3场(2 + 3 + 3)我们也可以用大小的一个领域(8)=>我们终于可以用47位(但仍四舍五入最多6个字节)
  • 如果仍然将每个编码数字存储为整数个字节,则可以使用直接存储字符所使用的相同内存量(14位适合2个字节,17位适合3个字节)。
+0

非常感谢Dario ...那是非常有帮助。根据我从接收方那里收到的文件,还有一个疑问是,他们提到序列号是3字节,但是是96格式。它的最大值可以是884735.现在假设我想发送一个长度为123456的mod 96格式,它的长度将超过3个字节。那令我困惑? – chetan

+0

你不给我充足的信息回答: 什么意思是“启动序列”? ASCII文本字符串的前3个字符,他们想要将它们打包成3个字节的整数(很没意思,除非这是一个错误检测或某种“preivew”)或者它是一个“索引”所以它是一个编号为可打印ascii的数字,因为传输层只有7位,并且他们希望使用未使用的值来检测传输错误? – GameDeveloper

+0

您知道,当您编码时必须清楚: 1)数据你真的想要在代码级别(无论是文本字符串,布尔标志还是数字) 2)通过电缆传输数据的方式 您还没有告诉我每个字段在代码级别代表什么。所以我不知道您是否需要对正在传输的数据使用“解码”或“编码”(并注意我偶然指出大小是一样的,所以我不能通过查看大小来弄清楚它的大小。我编码的东西也没有节约空间也很愚蠢^^)。这样的公司是否使用标准?至极rfc? – GameDeveloper