IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> HEX补码问题,将高位为1的HEX进行取二进制,取反,+1得到负值 -> 正文阅读

[移动开发]HEX补码问题,将高位为1的HEX进行取二进制,取反,+1得到负值

当前问题主要是Android和下位机交互的时候用到,像一些环境传感器,陀螺仪之类的

1.从传感器获取HEX返回值,取出其中的有用值。我们当前使用"BDD4"这个值来写demo

2.检查高位是否为1,这个是和0x80进行或处理。"BDD4"高位即“BD”,如下

int ten = Integer.parseInt("BDD4".substring(0,2), 16);
Log.e("tiwolf", "二进制:" + ten);
byte value = (byte) ten;//解决二进制补码(两个十六进制,这里即-128-127)
if ((value & 0x80)==0x80){
?????如果高位为1,则在这里处理HEX补码问题
}else{
?????如果高位不为1,则直接得到数值 
}

3.高位为1,处理补码问题

byte[] bytes = hexStr2Byte("BDD4");

// 2进制取反
String str2 = "";
byte temp;
for (int i = 0; i < bytes.length; i++) {
    temp = bytes[i];
    bytes[i] = (byte) (~temp);
    str2 += Integer.toBinaryString((bytes[i] & 0xFF) + 0x100).substring(1);
}
Log.e("tiwolf", "取反后二进制:" + str2);
// 取反后+1
String add_1 = Solution(str2, "1");
Log.e("tiwolf", "取反后二进制+1:" + add_1);

// 将取反+1后的二进制字符串转10进制
int d = Integer.parseInt(add_1, 2);
Log.e("tiwolf", "二进制字符串转10进制:" + -d);
/**
 * 16进制String转2进制bite
 *
 * @param hex
 * @return
 */
public static byte[] hexStr2Byte(String hex) {
    ByteBuffer bf = ByteBuffer.allocate(hex.length() / 2);
    for (int i = 0; i < hex.length(); i++) {
        String hexStr = hex.charAt(i) + "";
        i++;
        hexStr += hex.charAt(i);
        byte b = (byte) Integer.parseInt(hexStr, 16);
        bf.put(b);
    }
    return bf.array();
}

/**
 * 两个二进制字符串求和
 *
 * @param a
 * @param b
 * @return
 */
public static String Solution(String a, String b) {
    StringBuilder ans = new StringBuilder();
    int ca = 0;
    for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
        int sum = ca;
        sum += i >= 0 ? a.charAt(i) - '0' : 0;
        sum += j >= 0 ? b.charAt(j) - '0' : 0;
        ans.append(sum % 2);
        ca = sum / 2;
    }
    ans.append(ca == 1 ? ca : "");
    return ans.reverse().toString();
}

全部完整处理补码 代码如下:

package com.example.calutil;

import android.util.Log;

import java.nio.ByteBuffer;

/**
 * @author tiwolf_li
 * @Date on 2021/9/23
 * @Description
 */
class CalUtil {

    public void setCal(String hexStr){

//        String sixteen = "7D";
        //先判断高位是否为1,如果是则进行补码操作,如果不是则直接转成10进制
        int ten = Integer.parseInt(hexStr.substring(0,2), 16);
        Log.e("tiwolf", "二进制:" + ten);

        byte value = (byte) ten;//解决二进制补码(两个十六进制,这里即-128-127)
        Log.e("tiwolf", "二进制1:" + value);

//        String ss = String.valueOf(value);
//        int wd = Integer.parseInt(ss);
//        Log.e("tiwolf", "二进制数值:" + wd);
        if ((value & 0x80)==0x80){
            //这个处理高位为1以后的逻辑
            Log.e("tiwolf", "setCal这个需要补码: "+hexStr.substring(0,2)+";"+value);

            byte[] bytes = hexStr2Byte(hexStr);

            // 2进制取反
            String str2 = "";
            byte temp;
            for (int i = 0; i < bytes.length; i++) {
                temp = bytes[i];
                bytes[i] = (byte) (~temp);
                str2 += Integer.toBinaryString((bytes[i] & 0xFF) + 0x100).substring(1);
            }
            Log.e("tiwolf", "取反后二进制:" + str2);
            // 取反后+1
            String add_1 = Solution(str2, "1");
            Log.e("tiwolf", "取反后二进制+1:" + add_1);

            // 将取反+1后的二进制字符串转10进制
            int d = Integer.parseInt(add_1, 2);
            Log.e("tiwolf", "二进制字符串转10进制:" + -d);
        }else {
            int data = Integer.parseInt(hexStr, 16);
            Log.e("tiwolf", "setCal: 直接得到数值="+data);
        }


    }

    /**
     * 16进制String转2进制bite
     *
     * @param hex
     * @return
     */
    public static byte[] hexStr2Byte(String hex) {
        ByteBuffer bf = ByteBuffer.allocate(hex.length() / 2);
        for (int i = 0; i < hex.length(); i++) {
            String hexStr = hex.charAt(i) + "";
            i++;
            hexStr += hex.charAt(i);
            byte b = (byte) Integer.parseInt(hexStr, 16);
            bf.put(b);
        }
        return bf.array();
    }

    /**
     * 两个二进制字符串求和
     *
     * @param a
     * @param b
     * @return
     */
    public static String Solution(String a, String b) {
        StringBuilder ans = new StringBuilder();
        int ca = 0;
        for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
            int sum = ca;
            sum += i >= 0 ? a.charAt(i) - '0' : 0;
            sum += j >= 0 ? b.charAt(j) - '0' : 0;
            ans.append(sum % 2);
            ca = sum / 2;
        }
        ans.append(ca == 1 ? ca : "");
        return ans.reverse().toString();
    }

}

借鉴参考了:

16进制转10进制,以及二进制负数的补码_meixi_android的博客-CSDN博客

Java中HEX负数补码问题 将高位为1的16进制数据转二进制 取反 加一取得负数问题_挨T工作室的博客-CSDN博客

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:40:21  更:2021-09-24 10:43:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:58:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码