某公司的任职考试编程题,有兴趣的可以来挑战下

yfox 2016-03-12 05:31:33

从给定输入的数据流中搜索数据帧并完成处理,输入数据是小端数据,处理函数定义如下:
DataProc(UINT8* aucInput, UINT32 uwByteLen, UINT32 *puwFrameNum, UINT32 * puwOutput, UINT32* puwA, UINT32* puwB)
{
Return TRUE;/*正确处理的返回值*/
}

aucInput为输入,表示输入Byte序列的头指针,
uwByteLen为输入,表示输入长度20~10000 byte,不是该长度返回FAILSE;
puwFrameNum为输出,表示函数处理所有有效帧后输出的帧的个数,无效帧条件参考下面的描述
puwOutput为输出,表示处理的结果输出地址指针
puwA为输出,表示输出的操作历史数A
puwB为输出,表示输出的操作历史数B

后面的数据处理都是小端序。即从低到高的bit顺序。

从输入数据中搜索解析出帧数据,帧数据结构为:
32bit固定帧头为魔幻数0xaabbccdd
26bit FrameNum帧号
3bit 操作长度OprLen ,OprLen为0时,搜索到FrameNum值为0x3FFFFF的帧表示处理结束,结束后即使搜索到有效数据帧也不处理,其他值不考虑。
3bit DataLen数据长度指示。有效数据长度为1~4,否则返回FALSE
注意帧头位置可以非Byte对齐。

帧头后为“OprType+操作的参数+data”组成,根据不同类型,长度为变长的,操作的参数与OprType有关;data为数据序列,也与OprType有关(不一定有数据)。

3bit OprType表示处理类型,其中处理方式值为2或者6表示错误,直接返回FALSE

OprType = 0表示NOP操作,NOP的结构为“BitLen+RandomBit”,其中5bit BitLen表示后面有多少bit的数据,RandomBit为无用的数据。NOP操作不影响任何输出结果。

OprType=1表示ADD16操作,即16bit加法操作,ADD16的数据结构为“ind0+src0+ind1+src1+ind2+dst”,总共26bit。其中ind0和ind1为2bit,表示所有的Src的来源类型,ind2为1bit,表示dst的保存类型,src0、src1、dst都是7bit长度。其中src0、src1是加法操作的两个加数来源指示,dst是加法的结果。
ind = 0表示加数都从后面的data序列中读出,src则表示从data序列的读取位置,两个加数都是16bit,需软件检测读取数据在序列中位置的合法性,不合法则返回FALSE
Ind=1表示加数来源于历史数puwA或者puwB,src为0表示数据来源于历史数据puwA,否则来源于历史数据puwB
Ind=3表示加数来源于立即数,src即为立即数
Ind>3需返回FALSE
相加结果为16bit数据,不需要考虑溢出,dst的ind指示结果存入类型
Ind=0表示结果写入由dst指示的数据序列中,长度为16bit
Ind=1表示结果写入历史数中,dst为0表示历史数puwA,否则表示puwB,注意16bit写入历史数的低16bit。

OprType=3表示SWAPBIT操作,SWAPBIT的数据结构为”ind0+src0+ind1+dst”,共16bit。
其中ind0为1bit,表示数据的来源;src0长度7bit;ind1为1bit表示结果输出的类型,dst长度为7bit。
Ind=0表示来源于data序列,src0为数据的读取位置,读出数据长度为32bit
Ind=1表示来源于历史数,src0为0表示来源于历史数A,否则为来源于历史数B
将数据(32bit)取出后做镜像交换,即31bit与0bit值交换,30bit与1bit的值交换,交换后的结果存入ind1指示的输出类型中,参考上面的ind描述。

OprType=4表示BITCOMB操作,即bit合并加法操作,bitcomb的数据结构为“ind0+src0+ind1+src1+ind2+dst+index”,总共29bit。其中ind0和ind1为1bit,表示所有的Src的来源类型,ind2为1bit,表示dst的保存类型,src0、src1、dst都是7bit长度。其中src0、src1是合并操作的两个数据来源指示,dst是合并的结果;index为合并截取的bit序列的位置。
ind = 0表示数据都从后面的data序列中读出,src则表示从data序列的读取位置,两个源数据都是32bit,需软件检测读取数据在序列中位置的合法性,不合法则返回FALSE
Ind=1表示数据来源于历史数puwA或者puwB,src为0表示数据来源于历史数据puwA,否则来源于历史数据puwB
取出两个源数据后,根据index的值,把src0的0~index和src1的(index+1)~31比特序列合并,src0在低位,src1在高位。
dst的ind指示结果存入类型
Ind=0表示结果写入由dst指示的数据序列中
Ind=1表示结果写入历史数中,dst为0表示历史数puwA,否则表示puwB

OprType=6表示CALL操作,CALL的数据结构只有26bit数据,表示帧号FrameNum,CALL操作即转到FrameNum指示的帧进行处理,数据源保证不出现递归的现象

OprType=6表示RETURN操作,即转移到CALL操作结束位置,搜索的下一个帧进行操作。

说明:
输入的所有帧数据处理完后(注意处理结束的条件处理)将结果保存到puwOutput中
输出历史操作数只保存最后一次操作的,中间操作历史数需刷新。
Output是测试函数动态申请的,输出结果长度超过将会产生内存溢出
程序中任何内存崩溃或者无法返回结果都记0分
完成时间为4~6小时,超过4小时每15分钟扣2分,不满15分钟按15分钟算,超过6小时记0分。
请用C语言完成上面的题目
...全文
211 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2016-03-14
  • 打赏
  • 举报
回复
单独题目是不行的,还必须提供测试数据, 如果测试数据,自己搜集的话 四个小时估计够呛,除非做过,或者是高手
yfox 2016-03-12
  • 打赏
  • 举报
回复
没办法搞PPT出来,只能自己描述,没有图看起来比较恼火,原谅下!其实PPT理解题目都要花1小时。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧