首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c# 中如何获取 字节二进制的高位低位 并且取反之类的. 没学过C啊 吐血

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

c# 中怎么获取 字节二进制的高位低位 并且取反之类的. 没学过C啊 吐血

引用
 
开发个空调板的开关接口 说明书这样写 :

LENGTH的数据格式如下表所示:
高字节
校验码LCHKSUM
D15 D14D13 D12
低字节 (长度标示码LENID(表示INFO的传送中ASCII码字节数))
D11 D10D9 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;
            [FieldOffset(0)]


            public byte a;
            [FieldOffset(1)]
            public byte b;
        }
        static void Main(string[] args)
        {
            stu s = new stu();
            s.sum = 18;
            var t = (s.a / 16 + s.a % 16 + s.b / 16 + s.b % 16) % 16;
            var str = ((ushort)(s.sum 
[解决办法]
 (ushort)(~(ushort)t + 1u) << 12)).ToString("X");
            Console.WriteLine(str);
            Console.ReadLine();
        }


[解决办法]
练习一下linq,嘿嘿

using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(GetValue(18));
        }

        static string GetValue(int input)
        {
            var m = Convert.ToString(input, 2).PadLeft(12, '0'); //输入转字符串
            var i = 0;
            var sum = m.GroupBy(v => i++ % 3).Select(c => Convert.ToInt32(string.Join("",c),2)).Sum(); //求和
            var check = (~sum + 1) & 15; //取反+1
            var result = (check << 12) + input; //串连
            return Convert.ToString(result, 16);
        }
    }
}

热点排行