日期:2014-05-17  浏览次数:20883 次

问个进制显示 转换的问题
最近在做个接口 按照接口说明书上其中一段话

引用
说明书说明
例:收到或发送的字符序列是:“~1203400456ABCDFEFC72CR”(“~”为SOI,“CR”为EOI),则最后五个字符“FC72CR”中的FC72是CHKSUM,计算方法是:
‘1’+‘2’+‘0’+……+‘A’+‘B’+……+‘F’+‘E’
=31H+32H+30H+……+41H+42H+……46H+45H=038EH
其中‘1’表示1的ASCII码值,‘E’表示E的ASCII码值。038EH模65536余数是038EH,038EH取反加1就是FC72H。



        public static string CHKSUM(string str)
        {
            ushort sum = 0;
            System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
            byte[] byteArr = asciiEncoding.GetBytes(str);

            foreach (byte c in byteArr)
            {
                sum += c;
            }
            return (~(sum % 65535) + 1).ToString("X2");
        }


//调用这个方法

CHKSUM("1203400456ABCDFE");  结果返回的是 FFFFFC72 
我想得到的直接就是  "FC72"
虽然我可以硬截取后4位  但是我想有没有更好的办法 比如什么单字节 双字节之类的? 
.ToString("X1") 尝试过这样 不起作用

------解决方案--------------------
~(sum % 65535) + 1
问题在这里,结果已经转成int了

另外,既然你sum定义的是ushort (0~65535),而且你说的是模65536,这里干什么还多此一举的%呢,而且还是个错的值

按你说的,sum(ushort)模65536(10000H)余数取反加1
----> (ushort)(~sum + 1u)
------解决方案--------------------
string s = "FFFFFC72".TrimStart('F');