c# md5 加密byte[]

shuihan20e 2014-02-10 03:34:13
结构体声明如下

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct TMsgHeadInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public char[] MsgCode;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public char[] MsgType; public byte SenderType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public char[] Sender; public byte ReceiverType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public char[] Receiver; public int TotalLength;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public char[] VerifyCode;
}

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct TDevCheck
{
public byte DevType;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public char[] DevCode;
public Int32 OutTime;
}

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct TDevChecks
{
public TMsgHeadInfo MsgHead;
public TDevCheck DevCheck;
}


TDevChecks DevChecks;// = new TDevChecks();
DevChecks.MsgHead.MsgCode = "02".ToCharArray();
DevChecks.MsgHead.MsgType = "02".ToCharArray();
DevChecks.MsgHead.Receiver = "000000".ToCharArray();
DevChecks.MsgHead.ReceiverType = 4;
DevChecks.MsgHead.Sender = "280300".ToCharArray();//Global.sLocalCode.ToCharArray();
DevChecks.MsgHead.SenderType = 1;
DevChecks.MsgHead.TotalLength = 69;
DevChecks.MsgHead.VerifyCode = "235A3ECDB49A612AFDE4F4C3D6735D5D".ToCharArray();
DevChecks.DevCheck.DevCode = "2803004004".ToCharArray();
DevChecks.DevCheck.DevType = 1;
DevChecks.DevCheck.OutTime = Global.nCheckOutTime;
DevChecks.MsgHead.VerifyCode =MD5Byte(Global.tool.StructToBytes(DevChecks.DevCheck)).ToCharArray();
string md5 = new string(DevChecks.MsgHead.VerifyCode);
txt.Text = md5;

如上面的代码,C#算出的是
9ACFE5A41240B9D8AC6B47F46D9BA2F
其他语言算出的如下
9ACFE5A41240B9D8AC06B47F46D9BA2F
也就是少了一位,应该是32位,却是31位

MD5加密算法如下
        public string MD5Byte(byte[] by)
{
string pwd = "";
MD5 md5 = MD5.Create();
byte[] s = md5.ComputeHash(by);
for (int i = 0; i < s.Length; i++)
{
pwd = pwd + s[i].ToString("X");
}
return pwd;
}

结构体转byte[]算法如下
        public Byte[] StructToBytes(Object structure)
{
Int32 size = Marshal.SizeOf(structure);
//Console.WriteLine(size);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structure, buffer, false);
Byte[] bytes = new Byte[size];
Marshal.Copy(buffer, bytes, 0, size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}


另外如何得到一个对象的大小Marshl.sizeof得到的值不对啊
...全文
407 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
少了个0 pwd = pwd + s[i].ToString("X2"); 不足两位时补0
种草德鲁伊 2014-02-10
  • 打赏
  • 举报
回复
我读书少,楼主不要骗我
Ny-6000 2014-02-10
  • 打赏
  • 举报
回复
不了解,帮顶下.
feiyun0112 2014-02-10
  • 打赏
  • 举报
回复
s[i].ToString("X2")

*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/

110,533

社区成员

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

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

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