读书人

c# 中如何获取 字节二进制的高位低位

发布时间: 2013-01-25 15:55:29 作者: rapoo

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);
}
}
}

读书人网 >C#

热点推荐