jy-plc/Services/models/PackageFlag.cs

122 lines
3.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Text;
namespace IceCoffee.HJ212
{
/// <summary>
/// 拆分包及应答标志
/// </summary>
public class PackageFlag
{
public byte V5 { get; set; }
public byte V4 { get; set; }
public byte V3 { get; set; }
public byte V2 { get; set; }
public byte V1 { get; set; }
public byte V0 { get; set; }
/// <summary>
/// 命令是否应答1应答0不应答
/// </summary>
public byte A { get; set; }
/// <summary>
/// 是否有数据包序号1 - 数据包中包含包号和总包数两部分0 - 数据包中不包含包号和总包数两部分
/// </summary>
public byte D { get; set; }
/// <summary>
/// 标准版本号
/// <para>000000 表示标准 HJ/T212-2005</para>
/// <para>000001 表示本次标准修订版本号</para>
/// </summary>
public string Version
{
get
{
return $"{V5}{V4}{V3}{V2}{V1}{V0}";
}
}
/// <summary>
/// 解析
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static PackageFlag Parse(string data)
{
byte flag = byte.Parse(data);
return new PackageFlag()
{
V5 = GetBit(flag, 7),
V4 = GetBit(flag, 6),
V3 = GetBit(flag, 5),
V2 = GetBit(flag, 4),
V1 = GetBit(flag, 3),
V0 = GetBit(flag, 2),
D = GetBit(flag, 1),
A = GetBit(flag, 0)
};
}
/// <summary>
/// 序列化
/// </summary>
/// <returns></returns>
public string Serialize()
{
return Convert.ToInt32($"{V5}{V4}{V3}{V2}{V1}{V0}{D}{A}", 2).ToString();
}
/// <summary>
/// 获取取第index位
/// </summary>
/// <remarks>
/// index从0开始
/// </remarks>
/// <param name="b"></param>
/// <param name="index"></param>
/// <returns></returns>
private static byte GetBit(byte b, int index)
{
// (byte)((from & (0xFF << (index * 8))) >> (index * 8))
return ((b & (1 << index)) > 0) ? (byte)1 : (byte)0;
}
/// <summary>
/// 将第index位设为1
/// </summary>
/// <remarks>
/// index从0开始
/// </remarks>
/// <param name="b"></param>
/// <param name="index"></param>
/// <returns></returns>
private static byte SetBit(byte b, int index) { return (byte)(b | (1 << index)); }
/// <summary>
/// 将第index位设为0
/// </summary>
/// <remarks>
/// index从0开始
/// </remarks>
/// <param name="b"></param>
/// <param name="index"></param>
/// <returns></returns>
private static byte ClearBit(byte b, int index) { return (byte)(b & (byte.MaxValue - (1 << index))); }
/// <summary>
/// 将第index位取反
/// </summary>
/// <remarks>
/// index从0开始
/// </remarks>
/// <param name="b"></param>
/// <param name="index"></param>
/// <returns></returns>
private static byte ReverseBit(byte b, int index) { return (byte)(b ^ (byte)(1 << index)); }
}
}