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

c# 中怎么获取 字节二进制的高位低位 并且取反之类的. 没学过C啊 吐血
引用
 
开发个空调板的开关接口 说明书这样写 :

LENGTH的数据格式如下表所示:
高字节
校验码LCHKSUM
D15 D14 D13 D12
低字节 (长度标示码LENID(表示INFO的传送中ASCII码字节数))
D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
  
LENGTH共2个字节,由LENID和LCHKSUM组成,LENID表示INFO项的ASCII码字节数,当LENID=0时,INFO为空,即无该项。LENGTH传输中先传高字节,再传低字节,分四个ASCII码传送。

--重点在这下面 我该怎么写 ---
校验码的计算:D11D10D9D8+D7D6D5D4+D3D2D1D0,求和后模16余数取反加1。

例:
INFO项的ASCII码字节数为18,即LENID=0000 0001 0010B。(比如这步 Convert.ToString(18, 2) 得到的是10010 如何能得到  0000 0001 0010 这样的2进制? )

D11D10D9D8+D7D6D5D4+D3D2D1D0=0000B+0001B+0010B=0011B, (上步如果能解决 这步应该就好了 )

0011B模16余数=0011B,(这步 我倒知道  用 %)

0011B取反加1就是1101B,即LCHKSUM为1101B。 (这步我也知道用~)

可得:LENGTH为1101 0000 0001 0010B,即D012H。 (这边是2个string 硬拼接吗?)


没学过C 对进制完全一抹黑 恶补中. 

按照上面的说明 我的方法该怎么写 传入 18 可以计算得到 D012?


------解决方案--------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ushort data = 18;
            ushort data1 = data;
            byte sum = 1;
            while (data1 != 0)
            {
                if (data1 % 2 == 1) sum++;
                data1 = (ushort)(data1 / 2);
            }
            byte checksum = (byte)(~(sum % 16) + 1);
            ushort result = (ushort)(data 
------解决方案--------------------
 checksum << 12);
            Console.WriteLine(result.ToString("X"));
        }
    }
}


D012
Press any key to continue . . .
------解决方案--------------------
[StructLayout(LayoutKind.Explicit)]
        struct stu
        {
            [FieldOffset(0)]
            public ushort sum;