晕了,懂C++的人进

handsomge 2010-04-03 05:50:36
高人请将该算法转化成 C#,多谢! 我是晕了。

赫赫,不限手法,只要结果正确。

struct B
{
unsigned char lo;
unsigned char hi;
};
union w2b
{
unsigned short w;
struct B b;
};
union s2b
{
signed short w;
struct B b;
};
unsigned short CRC16(unsigned char *buf, unsigned char len)
{
union w2b CRC16;
unsigned char i,j;
unsigned short poly = 0xa001;

CRC16.w = 0xffff;
while(len--)
{
CRC16.b.lo ^= *buf++;
for (i = 0; i < 8; i++)
{
j = CRC16.b.lo & 0x01;
CRC16.w >>= 1;
if (j) CRC16.w ^= poly;
};
};
return CRC16.w;
}
...全文
198 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
handsomge 2010-04-04
  • 打赏
  • 举报
回复
搞定,谢谢几位朋友! 上完整代码

public class CRC16
{

struct B
{
public byte lo;
public byte hi;
}
[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]
struct w2b
{
[FieldOffset(0)]
public ushort w;
[FieldOffset(0)]
public B b;
}
public ushort CRC16(byte[] buf, byte len)
{
w2b crc16;
byte i, j, p = 0;
ushort poly = 0xa001;

crc16.b.lo = 0x00;
crc16.w = 0xffff;
while (len-- > 0)
{
crc16.b.lo ^= buf[p++];
for (i = 0; i < 8; i++)
{
j = (byte)(crc16.b.lo & 0x01);
crc16.w >>= 1;
if (j > 0)
crc16.w ^= poly;
}
}
return crc16.w;

}

}

hshxf 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 handsomge 的回复:]

搞定,谢谢几位朋友! 上完整代码
C# code

public class CRC16
{

struct B
{
public byte lo;
public byte hi;
}
[System.Runtime.InteropServices.StructLa……
[/Quote]
呵呵,和你的c代码很像了,struct模拟union这个技术还是很新颖的。
yysde 2010-04-03
  • 打赏
  • 举报
回复
看看,好像不懂。不是跟本不懂。
hshxf 2010-04-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hshxf 的回复:]

引用 6 楼 lijunfeng 的回复:

C# code

// 没测试,感觉应该差不多
struct B
{
public byte lo;
public byte hi;
}
struct w2b
{
public ushort w;
public B b;……

错了,union的field是共享内存的,所以 w 和 B b 的内存是同一个,修改w,是同时……
[/Quote]

7楼,我给你翻译了一个,应该是对的。
lijunfeng 2010-04-03
  • 打赏
  • 举报
回复
学习
另外如果用 static 行不行呢?
xingyuebuyu 2010-04-03
  • 打赏
  • 举报
回复
       unsafe ushort CRC16(byte *buf, byte  len)
{
w2b CRC16;
byte i,j;
ushort poly = 0xa001;

CRC16.w = 0xffff;
CRC16.b = new B();
while((len--)!=0)
{
CRC16.b.lo ^= *buf++;
for (i = 0; i < 8; i++)
{
j =(byte) (CRC16.b.lo & 0x01);
CRC16.w >>= 1;
if (j!=0) CRC16.w ^= poly;
};
};
return CRC16.w;
}


要打开不安全代码开关。
菜单“项目”--“属性”--“生成”--“允许不安全代码”前面打勾
xingyuebuyu 2010-04-03
  • 打赏
  • 举报
回复
如何在C#中模拟C++的联合(Union)
http://www.cnblogs.com/allenlooplee/archive/2004/12/25/81917.html

[StructLayout(LayoutKind.Sequential,Pack=1)]
struct B
{
public byte lo;
public byte hi;
}

[StructLayout(LayoutKind.Explicit, Pack = 1)]
struct w2b
{
[FieldOffset(0)]
public ushort w;
[FieldOffset(2)]
public B b;
}

[StructLayout(LayoutKind.Explicit, Pack = 1)]
struct s2b
{
[FieldOffset(0)]
public short w;
[FieldOffset(2)]
public B b;
}
handsomge 2010-04-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hshxf 的回复:]
引用 6 楼 lijunfeng 的回复:

C# code

// 没测试,感觉应该差不多
struct B
{
public byte lo;
public byte hi;
}
struct w2b
{
public ushort w;
public B b;……

错了,union的field是共享内存的,所以 w 和 B b 的内存是同一个,修改w,是同时修……
[/Quote]

这是个棘手的问题
hshxf 2010-04-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lijunfeng 的回复:]

C# code

// 没测试,感觉应该差不多
struct B
{
public byte lo;
public byte hi;
}
struct w2b
{
public ushort w;
public B b;……
[/Quote]
错了,union的field是共享内存的,所以 w 和 B b 的内存是同一个,修改w,是同时修改 b.lo 和 b.hi
hshxf 2010-04-03
  • 打赏
  • 举报
回复
ushort CRC16(byte[] buf, short len)
{
byte[] CRC16 = new byte[2];
ushort poly = 0xa001;

CRC16[0] = 0xff;
CRC16[1] = 0xff;
int index = 0;
while((len--) > 0)
{
CRC16[0] ^= buf[index++];
for (int i = 0; i < 8; i++)
{
int j = CRC16[0] & 0x01;
ushort t;
t = BitConverter.ToUInt16(CRC16, 0);
t >>= 1;
if (j > 0)
{
t ^= poly;
CRC16 = BitConverter.GetBytes(t);
}
}
}
return BitConverter.ToUInt16(CRC16, 0);
}
lijunfeng 2010-04-03
  • 打赏
  • 举报
回复

// 没测试,感觉应该差不多
struct B
{
public byte lo;
public byte hi;
}
struct w2b
{
public ushort w;
public B b;
}
struct s2b
{
public ushort w;
public B b;
}
ushort CRC16(byte[] buf, byte len)
{
w2b crc16;
byte i, j, p = 0;
ushort poly = 0xa001;

crc16.w = 0xffff;
while (len-- > 0)
{
crc16.b.lo ^= buf[p++];
for (i = 0; i < 8; i++)
{
j = (byte)(crc16.b.lo & 0x01);
crc16.w >>= 1;
if (j > 0) crc16.w ^= poly;
}
}
return crc16.w;
}
lzsh0622 2010-04-03
  • 打赏
  • 举报
回复
handsomge 2010-04-03
  • 打赏
  • 举报
回复
这是别人写的下位机校验,我用C#写上位机校验(标准CRC16算法).结果总对不上
handsomge 2010-04-03
  • 打赏
  • 举报
回复
可怜的是,这段代码我看不明白.
cbsoftlover 2010-04-03
  • 打赏
  • 举报
回复
C#中应该没有与联合对应的机制吧,也不需要啊。

111,092

社区成员

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

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

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