Vsq.java 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package wei.yigulu.iec104.apdumodel;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import java.util.List;
  6. /**
  7. * Vsq
  8. */
  9. @AllArgsConstructor
  10. @Data
  11. @NoArgsConstructor
  12. /**
  13. * vsq 可变限定词 分为 sq 和 num
  14. * 可变结构限定词 ASDU第一位
  15. * 该值为二位16进制数 先转成8位二进制
  16. * 二进制第8位 为0 单一信息元素寻址
  17. * 二进制第8位 为1 连续信息元素寻址
  18. * 剩下7位转为10进制 数值为信息元素数目
  19. * @author 修唯xiuwei
  20. * @version 3.0
  21. */
  22. public class Vsq {
  23. /**
  24. * Read byte vsq
  25. *
  26. * @param value value
  27. * @return the vsq
  28. */
  29. public Vsq readByte(Byte value) {
  30. original = value;
  31. String vsqFormat = String.format("%08d", Integer.parseInt(Integer.toBinaryString(this.original & 0xff)));
  32. //可变结构限定词,转为二进制后获取第8位
  33. sq = Integer.parseInt(vsqFormat.substring(0, 1));
  34. num = Integer.parseInt(vsqFormat.substring(1, 8), 2);
  35. return this;
  36. }
  37. /**
  38. * vsq 的具体值
  39. */
  40. byte original;
  41. /**
  42. * 标制 是 顺序元素 还是 单一元素 第8位
  43. */
  44. int sq;
  45. /**
  46. * 信息体元素地址数量 0-7位
  47. */
  48. int num;
  49. /**
  50. * Encode *
  51. *
  52. * @param buffer buffer
  53. */
  54. public void encode(List<Byte> buffer) {
  55. if (this.getSq() == 1) {
  56. buffer.add((byte) (this.getNum() | 0x80));
  57. } else {
  58. buffer.add((byte) this.getNum());
  59. }
  60. }
  61. }