Byte Hex CRC计算笔记

简介: Byte Hex CRC计算笔记

例如,如果想要截取字节数组 01 03 00 01 00 00 14 0A 的第 5 和第 6 位数据,则可以使用以下代码:

byte[] input = {0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x14, 0x0A}; 
// 截取第 5 和第 6 位数据 
byte[] output = Arrays.copyOfRange(input, 4, 6); 
System.out.println(Arrays.toString(output));

输出结果将是:

请注意,在这种情况下,我们使用了 Arrays.copyOfRange(byte[], int, int) 方法来截取字节数组的一部分。第一个参数是输入字节数组,第二个参数是要从字节数组开始复制的索引,第三个参数是要复制的元素数。

此外,还可以使用 Arrays.toString(byte[]) 方法将字节数组转换为可打印的字符串,以便轻松查看结果。

127转16进制 java

在 Java 中,可以使用 Integer 类的 toHexString(int) 方法将整数转换为 16 进制字符串。

例如,如果想将整数 127 转换为 16 进制字符串,则可以使用以下代码:

int num = 127; 
String hexString = Integer.toHexString(num); 
System.out.println(hexString);

输出结果将是:

请注意,这是无符号 16 进制字符串。如果要将数字转换为有符号 16 进制字符串,则可以使用以下代码:

输出结果仍然是 `

0xFF如何装入byte数组 java

在 Java 中,可以使用两种方法将数字 0xFF 装入字节数组。

首先,可以使用位运算符将数字强制转换为字节,然后将其装入字节数组。例如:

byte[] array = new byte[1]; array[0] = (byte) 0xFF;

其次,可以使用 ByteBuffer 类的 put(byte) 方法将数字装入字节数组。例如:

在这两种情况下,字节数组中的值都将是 0xFF。

请注意,在使用位运算符转换数字时,需要注意数据范围。如果数字超出了字节的范围(即 -128 到 127),如果将数字 0xFF 转换为字节,则结果将是 -1。

这是因为字节数据类型只能表示整数范围为 -128 到 127 的值。由于 0xFF 在此范围之外,因此在转换为字节时将被截断。在使用位运算符进行强制转换时,将使用二进制补码来表示超出范围的数字,从而导致结果为 -1。

例如,0xFF 的二进制表示为 1111 1111。在将其转换为字节时,将使用二进制补码表示,即 1111 1111 附加一个符号位 1。

那怎么办?

如果想要将数字 0xFF 装入字节数组,并且希望结果为 0xFF 而不是 -1,则可以使用两种方法。

首先,可以使用 Byte.toUnsignedInt(byte) 方法将字节转换为无符号整数。例如:

byte b = (byte) 0xFF; int i = Byte.toUnsignedInt(b); 
System.out.println(i);  // 输出 255

其次,可以使用 ByteBuffer 类的 getInt() 方法将字节装入整数。例如:

在这两种情况下,输出结果都是 255。

请注意,如果将数字 0xFF 直接装入字节数组,则结果将是 -1。这是因为字节数据类型只能表示整数范围为 -128 到 127 的值。如果需要表示超出此范围的值,则必

可以使用 Integer 类的 toBinaryString(int) 方法将整数 255 转换为二进制字符串。例如:

int num = 255; 
String binaryString = Integer.toBinaryString(num); 
System.out.println(binaryString);

输出结果将是:

请注意,这是无符号二进制字符串。如果要将数字转换为有符号二进制字符串,则可以使用以下代码:

输出结果仍然是 11111111

请注意,在使用 String.format() 方法时,我们在二进制字符串前添加了 32 个空格,并使用 replace() 方法将其替换为 0。这样,就可以确保二进制字符串总是 32 位长,并且在必要时使用前导 0 补足字符串。

工具类

public static int[] getBinaryData(String hexString){
    int decimal = Integer.parseInt(hexString, 16);  // 16进制转10进制
    String binaryString = Integer.toBinaryString(decimal);  // 10进制转2进制
    int len = 16;
    int length = binaryString.length();
    if(length < len) {
        binaryString = String.format("%0"+(len-length)+"d%s",0, binaryString);
    }
    char[] chars = binaryString.toCharArray();
    int[] array = new int[chars.length];
    for (int i = 0; i < chars.length; i++) {
        array[i] = Integer.parseInt(String.valueOf(chars[i]), 2);
    }
    return array;
}
public static int[] getBinaryData(byte d1, byte d2){
    // byte[] input = {0x01, 0x03, 0x00, 0x01, (byte) 0xFF, (byte) 0x7F, 0x14, 0x0A};
    int d1ToUnsignedInt = Byte.toUnsignedInt(d1);
    int d2ToUnsignedInt = Byte.toUnsignedInt(d2);
    String d1BinaryString = String.format("%32s", Integer.toBinaryString(d1ToUnsignedInt)).replace(' ', '0');
    String d1Binary8bitString = d1BinaryString.substring(d1BinaryString.length() - 8);
 
    String d2BinaryString = String.format("%32s", Integer.toBinaryString(d2ToUnsignedInt)).replace(' ', '0');
    String d2Binary8bitString = d2BinaryString.substring(d2BinaryString.length() - 8);
 
    String date = d1Binary8bitString + d2Binary8bitString;
    // System.out.println("0XFF 0X7F的二进制:"+date);
    char[] chars = date.toCharArray();
    int[] array = new int[chars.length];
    for (int i = 0; i < chars.length; i++) {
        array[i] = Integer.parseInt(String.valueOf(chars[i]), 2);
    }
    System.out.println("0XFF 0X7F的int数组数据:"+ Arrays.toString(array));
    return array;
}
object CRC16Utils {
    fun addZeroForNum(str: String, strLength: Int): String? {
        var str = str
        var strLen = str.length
        var sb: StringBuffer
        while (strLen < strLength) {
            sb = StringBuffer()
            sb.append(str).append(" ")
            str = sb.toString()
            strLen = str.length
        }
        return str
    }
 
    fun stringToAscii(`val`: String): String? {
        val stringBuffer = StringBuffer()
        val chars = `val`.toCharArray()
        for (i in chars.indices) {
            stringBuffer.append(chars[i].code)
        }
        return stringBuffer.toString()
    }
 
    fun byteToInteger(b: Byte): Int {
        val value: Int
        value = b.toInt() and 0xff
        return value
    }
 
    fun CRC_A001(Buf: ByteArray): Int {
        var CRC: Int
        var i: Int
        var Temp: Int
        val Len: Int
        CRC = 0xffff
        Len = Buf.size
        i = 0
        while (i < Len) {
            CRC = CRC xor byteToInteger(Buf[i])
            Temp = 0
            while (Temp < 8) {
                CRC = if (CRC and 0x01 == 1) CRC shr 1 xor 0xA001 else CRC shr 1
                Temp++
            }
            i++
        }
        return CRC and 0xff
    }
}

CRC计算工具

通过这个工具了解到 CRC算法挺多种的 , 千万别搞混了 , 如果验证计算结果 可以通过该工具。


相关文章
|
Java
java 读取文件 获取byte[]字节 并执行Gzip的压缩和解压
java 读取文件 获取byte[]字节 并执行Gzip的压缩和解压
118 0
|
4月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
69 0
|
4月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
117 0
|
存储 Java 计算机视觉
java 之byte
当涉及到处理数据时,Java 提供了多种数据类型,其中包括 `byte` 类型。在本文中,我们将深入探讨 Java 中的 `byte` 数据类型,了解它的特点、用途以及在编程中的实际应用。
|
Java
Java中 String与基本数据类型,包装类,char[],byte[]之间的转换
Java中 String与基本数据类型,包装类,char[],byte[]之间的转换
93 0
|
存储 Java
[java 基础知识] byte int 互转
[java 基础知识] byte int 互转
131 0
|
Dubbo 应用服务中间件
Dubbo使用Hessian2序列化时针对Byte类型出现java.lang.ClassCastException
Dubbo使用Hessian2序列化时针对Byte类型出现java.lang.ClassCastException
181 0
|
存储 Java
java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别
java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别
190 0
|
JavaScript Java 数据库
UTF-8 GBK UTF8 GB2312之间的区别和关系,Java中String和byte[]间的转换,byte 是怎样转为汉字,汉字转byte的;char与
UTF-8 GBK UTF8 GB2312之间的区别和关系,Java中String和byte[]间的转换,byte 是怎样转为汉字,汉字转byte的;char与
353 0
UTF-8 GBK UTF8 GB2312之间的区别和关系,Java中String和byte[]间的转换,byte 是怎样转为汉字,汉字转byte的;char与