c/c++代码求翻译.

by_封爱 版主 2014-12-02 10:38:56

u16 clac_sum(void *data,u32 len)
{
if(len)
{
u32 cksum=0;
cksum += *(u8 *)p;
__packed u16 *p = data;
}
while(len>1)
{
cksum = (cksum >>16) + (cksum & 0xffff);
cksum += *p++;
cksum +=(cksum>>16);
len-=2;
return ~cksum;
}
}


上面是我手动打了. 为了方便大家帮修改..下面是原始文件

妹的 上传不给力....

就酱紫吧.. 翻译c#的

...全文
260 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
by_封爱 版主 2014-12-02
  • 打赏
  • 举报
回复
不一样吗? 他没换行 我有换行啊....
宝_爸 2014-12-02
  • 打赏
  • 举报
回复
你贴的和你敲进去的完全不一样啊。
by_封爱 版主 2014-12-02
  • 打赏
  • 举报
回复
宝_爸 2014-12-02
  • 打赏
  • 举报
回复
google到的 __packed The __packed qualifier sets the alignment of any valid type to 1. This means that: there is no padding inserted to align the packed object objects of packed type are read or written using unaligned accesses. The __packed qualifier applies to all members of a structure or union when it is declared using __packed. There is no padding between members, or at the end of the structure. All substructures of a packed structure must be declared using __packed. Integral subfields of an unpacked structure can be packed individually. The __packed qualifier does not affect local variables of integral type. 好像local变量使用__packed 没有效果。
宝_爸 2014-12-02
  • 打赏
  • 举报
回复
应该是这样?

u16 clac_sum(void *data,u32 len)
{
  if(len)
  {
    u32 cksum=0;
    __packed u16 *p = data;
    cksum += *(u8 *)p;
    while(len>1)
    {
        cksum = (cksum >>16) + (cksum & 0xffff);
        cksum += *p++;
        cksum +=(cksum>>16);
        len-=2;
        return ~cksum;
  }


  }
}
也不对啊,while里面一次就return了?
by_封爱 版主 2014-12-02
  • 打赏
  • 举报
回复
引用 1 楼 findcaiyzh 的回复:
kao 很久不用C/C++了。都不认识了 __packed是啥东西?
我c#出身 我只知道这个方法的名字是clac_sum.....
宝_爸 2014-12-02
  • 打赏
  • 举报
回复
kao 很久不用C/C++了。都不认识了 __packed是啥东西?
by_封爱 版主 2014-12-02
  • 打赏
  • 举报
回复
引用 17 楼 findcaiyzh 的回复:
大概写了一个, 没有验证,你可以自己调试一下。

        public ushort clac_sum(byte[] data, uint len)
        {
            uint cksum = 0;
            int index = 0;
            while(len > 1)
            {
                cksum += BitConverter.ToUInt16(data, index);
                index += 2;
                len -= 2;
            }

            if (len > 0)
            {
                cksum += data[len - 1];
            }

            cksum = (cksum >> 16) + (cksum & 0xffff);
            cksum += (cksum >> 16);

            return (ushort)~cksum;

        }
解决了 谢谢.
宝_爸 2014-12-02
  • 打赏
  • 举报
回复
大概写了一个, 没有验证,你可以自己调试一下。

        public ushort clac_sum(byte[] data, uint len)
        {
            uint cksum = 0;
            int index = 0;
            while(len > 1)
            {
                cksum += BitConverter.ToUInt16(data, index);
                index += 2;
                len -= 2;
            }

            if (len > 0)
            {
                cksum += data[len - 1];
            }

            cksum = (cksum >> 16) + (cksum & 0xffff);
            cksum += (cksum >> 16);

            return (ushort)~cksum;

        }
by_封爱 版主 2014-12-02
  • 打赏
  • 举报
回复
翻译成c# public byte clac_sum(byte [] data,int len) { byte a=0; return a; }
宝_爸 2014-12-02
  • 打赏
  • 举报
回复
还是不对。应该是这样的:

u16 calc_sum(void *data, u32 len)
{
    u32 cksum = 0;
	__packed u16 *p = data;
	while (len > 1)
	{
		cksum += *p++;
		len -=2;
	}

	if (len)
	{
		cksum += *(u8 *)p;
	}

	cksum = (cksum >> 16) + (cksum & 0xffff);
	cksum += (cksum >> 16);
	return ~cksum;
}
by_封爱 版主 2014-12-02
  • 打赏
  • 举报
回复
引用 13 楼 findcaiyzh 的回复:
看起来就是一组数据byte[]的。 1 两个字节两个字节取,加起来,结果32位 2. 如果剩下一个字节,也加上去 3. 32位的结果,高16字节,左移16位,加到低16(高16位置零)位上。 4. 再做一遍3,因为第三步结果可能超出16位范围。
参数我就知道是byte [] 不过 我是玩c#的 移位这东西 惭愧啊.... 帮忙翻译下吧
宝_爸 2014-12-02
  • 打赏
  • 举报
回复
看起来就是一组数据byte[]的。 1 两个字节两个字节取,加起来,结果32位 2. 如果剩下一个字节,也加上去 3. 32位的结果,高16字节,左移16位,加到低16(高16位置零)位上。 4. 再做一遍3,因为第三步结果可能超出16位范围。
by_封爱 版主 2014-12-02
  • 打赏
  • 举报
回复

u16 clac_sum(void *data,u32 len)
{
u32 cksum=0;
__packed u16 *p = data;
while(len>1)
{
   cksum += *p++;
   len-=2;
   if(len)
   {
      cksum += *(u8 *)p;
   }
   cksum = (cksum >>16) + (cksum & 0xffff);
   cksum +=(cksum>>16);
   return ~cksum;
}
}

这样子总对了吧...
宝_爸 2014-12-02
  • 打赏
  • 举报
回复
我看着也像先左边,后右边。
於黾 2014-12-02
  • 打赏
  • 举报
回复
看大括号的缩进
於黾 2014-12-02
  • 打赏
  • 举报
回复
你先确定阅读顺序 我怎么看都觉得应该是先从左边,从上到下,然后接右边代码,从上到下
扯淡砖家 2014-12-02
  • 打赏
  • 举报
回复
这看着不太对吧,*p的申明怎么在后面?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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