首页 > 其他分享 >【逻辑】简陋的配置项编码

【逻辑】简陋的配置项编码

时间:2022-11-04 23:35:03浏览次数:37  
标签:编码 逻辑 mSwitchCameraId 简陋 command Command byte data public

前言

最近在工作中,遇到一个需要通过 byte[] 类型发送控制指令的需求

过程分析

此次用到了两个简易的位运算和一个小常识

  1. 按位与(&):两个操作数按位进行与运算

  2. 按位或(|):两个操作数按位进行或运算

  3. 按位与(&)1 数据保持不变,按位或(|)0 数据将强制变为 0

结论

通过约定,首位作为是否切换的布尔值,其余位作为附加数据,可以在一个字节内编码一些简单的配置项信息

import java.util.Arrays;

public class Command {
    private boolean mSwitchCamera;

    private byte mSwitchCameraId;

    private boolean mSwitchQuality;

    private byte mSwitchQualityId;

    private Command() {
    }

    public Command(boolean mSwitchCamera, byte mSwitchCameraId, boolean mSwitchQuality, byte mSwitchQualityId) {
        this.mSwitchCamera = mSwitchCamera;
        this.mSwitchCameraId = mSwitchCameraId;
        this.mSwitchQuality = mSwitchQuality;
        this.mSwitchQualityId = mSwitchQualityId;
    }

    public static Command parse(byte[] dataArray) {
        Command command = null;
        if (dataArray != null && dataArray.length > 0) {
            command = new Command();
            command.mSwitchCamera = (dataArray[0] & -128) == -128;
            command.mSwitchCameraId = (byte) (dataArray[0] & 127);
            command.mSwitchQuality = (dataArray[1] & -128) == -128;
            command.mSwitchQualityId = (byte) (dataArray[1] & 127);
        }
        return command;
    }

    public static byte[] compact(Command command) {
        byte[] data = null;
        if (command != null) {
            data = new byte[2];
            data[0] = (byte) (command.mSwitchCameraId & 127);
            if (command.mSwitchCamera) {
                data[0] |= -128;
            }
            data[1] = (byte) (command.mSwitchQualityId & 127);
            if (command.mSwitchQuality) {
                data[1] |= -128;
            }
        }
        return data;
    }

    public boolean isSwitchCamera() {
        return mSwitchCamera;
    }

    public byte getSwitchCameraId() {
        return mSwitchCameraId;
    }

    public boolean isSwitchQuality() {
        return mSwitchQuality;
    }

    public byte getSwitchQualityId() {
        return mSwitchQualityId;
    }

    @Override
    public String toString() {
        return "Command{" + "mSwitchCamera=" + mSwitchCamera + ", mSwitchCameraId=" + mSwitchCameraId + ", mSwitchQuality=" + mSwitchQuality + ", mSwitchQualityId=" + mSwitchQualityId + '}';
    }

    public static void main(String[] args) {
        Command command = new Command(true, (byte) 3, false, (byte) 66);
        byte[] data = compact(command);
        System.out.println(Arrays.toString(data));
        System.out.println(parse(data));
    }
}

标签:编码,逻辑,mSwitchCameraId,简陋,command,Command,byte,data,public
From: https://www.cnblogs.com/slkagura/p/16859446.html

相关文章

  • R语言随机森林RandomForest、逻辑回归Logisitc预测心脏病数据和可视化分析|附代码数据
    全文链接:http://tecdat.cn/?p=22596本报告是对心脏研究的机器学习/数据科学调查分析。更具体地说,我们的目标是在心脏研究的数据集上建立一些预测模型,并建立探索性和建模方......
  • 实验二:逻辑回归算法实验
    【实验目的】理解逻辑回归算法原理,掌握逻辑回归算法框架;理解逻辑回归的sigmoid函数;理解逻辑回归的损失函数;针对特定应用场景及数据,能应用逻辑回归算法解决实际分类问题。......
  • Python编码规范
    一.命名规范类:采用​​驼峰命名法​​​,每个单词首字母大写,不使用​​_​​​​ElectricCar​​​、​​Car​​类的示例:全部小写,单词间使用​​_​​分割......
  • 按指定编码读写文件
    importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStreamRea......
  • 编码解码
    /**编码:字符串变成字节数组*解码:字节数组变字符串**String-->byte[];str.getBytes(charsetName);**byte[]-->String;newString(byte[],charsetName)*/......
  • 关于为什么使用 ascii GBK unicode编码
    关于为什么使用asciiGBKunicode编码由来:大家都知道计算机最早是美国人为了更加便捷的存储和计算数据发明的,但是呢计算机底层都是硬件,只能存储像0101这样的二进制数据,那......
  • 逻辑斯蒂回归 ----- 机器学习
                              ......
  • 逻辑分析仪使用介绍
    KingstVIS逻辑分析仪使用介绍@目录KingstVIS逻辑分析仪使用介绍一:逻辑分析仪是什么二:采样原理三:和示波器有什么区别四:产品介绍五:软件介绍六:设备连接七:使用详解八:常见......
  • 实验二:逻辑回归算法实验
    【实验目的】理解逻辑回归算法原理,掌握逻辑回归算法框架;理解逻辑回归的sigmoid函数;理解逻辑回归的损失函数;针对特定应用场景及数据,能应用逻辑回归算法解决实际分类问题。......
  • 实验二 逻辑回归与算法实验
    【实验目的】理解逻辑回归算法原理,掌握逻辑回归算法框架;理解逻辑回归的sigmoid函数;理解逻辑回归的损失函数;针对特定应用场景及数据,能应用逻辑回归算法解决实际分类问题......