CRC算法实现有2种方法,一、查表法,二、直接计算,查表法的计算速度相对来说比较快,本人介绍的方法是直接计算法,用了2种方法实现,都是面向对象进行算法的封装。
package com.wms.serial;
/**
* @author lino
* @version 2006/08/25
*/
public class CRC16{
public int value;
public CRC16()
{
value = 0;
}
/** update CRC with byte b */
public void update(byte aByte)
{
int a, b;
a = (int) aByte;
for (int count = 7; count >=0; count--) {
a = a << 1;
b = (a >>>8) & 1;
if ((value & 0x8000) != 0) {
value = ((value << 1) + b) ^ 0x1021;
} else {
value = (value << 1) + b;
}
}
value = value & 0xffff;
return;
}
/** reset CRC value to 0 */
public void reset()
{
value = 0;
}
public int getValue()
{
return value;
}
public static void main(String[] args) {
CRC16 crc16 = new CRC16();
byte[] b = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x00,(byte)0x00
};
for (int k = 0; k < b.length; k++)
{
crc16.update(b[k]);
}
System.out.println(Integer.toHexString(crc16.getValue()));
System.out.println(Integer.toHexString(b.length));
}
}
package com.wms.serial;
public class CRC162 {
public static final void main(String[] args){
CRC162 crc16 = new CRC162();
byte[] b = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x00,(byte)0x00
};
System.out.println(Integer.toHexString(crc16.encode(b)));
//再把这个2f49替换成b数组的最后两个字节的数组,生成一个新的数组b2
byte[] b2 = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x2f,(byte)0x49
};
System.out.println(Integer.toHexString(crc16.encode(b2))); //算出来是 0
//你可以自已构造一些byte进行加解密试试
}
public short encode(byte[] b){
short CRC_x = 0;
int pp = 65536; // 1<<16;
int pp2 = 69665; // (1<<16) + (1<<12) + (1<<5) + 1
for(int i=0;i<b.length;i++){
for(int j=0;j<8;j++){
CRC_x = (short)((CRC_x<<1) + (((b[i]<<j)&0x80)>>7));
if((CRC_x/pp) == 1){
CRC_x=(short)(CRC_x^pp2);
}
}
}
return CRC_x;
}
}
㈡ java 如何实现 binary search 二分查找法
在计算机领域,查找算法是解决数据搜索问题的关键。本文将着重介绍二分查找法及其在Java中的实现,提供一种高效且广泛适用的查找策略。
首先,让我们了解一下顺序查找。假设你在一个书架上找一本书,最直接的方法是逐本查看直至找到目标。在计算机中,顺序查找是针对顺序存储或链接存储的线性表进行的搜索过程。这种算法从表的一端开始,逐一比较每个元素与给定值,直到找到匹配项或遍历完整个表。
顺序查找的时间复杂度为O(n),其中n是表中的元素数量。平均查找长度为(n+1)/2,表明随着表的长度增加,查找所需的时间呈线性增长。
接下来,我们看看Java中顺序查找的实现:
java
public class SequentialSearch {
public int search(int[] array, int target) {
for (int i = 0; i < array.length; i++) {
if (array[i] == target) {
return i; // 返回目标元素的索引
}
}
return -1; // 如果未找到目标元素,返回-1
}
}
然而,如果数据已经排序,使用顺序查找就显得效率低下。这时,二分查找法能显着提高查找速度。
二分查找适用于有序数组,它通过不断缩小搜索范围来快速定位目标值。算法首先确定中间位置,与目标值比较,如果相等则查找成功;若目标值大于或小于中间值,则在相应的一半中继续查找,循环直至找到目标或范围为空。
二分查找的时间复杂度为O(log n),远优于顺序查找,尤其是在大数据集上。
以下是Java中二分查找的实现:
java
public class BinarySearch {
public int search(int[] array, int target) {
int left = 0;
int right = array.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (array[mid] == target) {
return mid;
} else if (array[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 查找失败
}
}
在实际应用中,为了提高灵活性和可拓展性,通常会将查找接口与具体实现分离。例如:
java
public interface Search {
int search(int[] array, int target);
}
这样,你可以在不同的场景下使用不同的查找算法,而无需修改调用代码。
为了更好地支持不同类型的比较,二分查找法可以进一步优化,以适应非整数类型,如字符串或长整型。通过比较对象的`compareTo`方法,我们可以实现更加通用的查找逻辑。
最后,将这些查找算法封装为可复用的库组件,便于在项目中快速集成和调用,是非常推荐的做法。在Java中,可以将这些功能发布到Maven中央仓库,以便其他开发人员轻松引用。
本文旨在提供二分查找法及其Java实现的基本概念和步骤。通过本文的学习,你将对查找算法有一个更深入的理解,并能够灵活地在实际项目中应用这些知识。希望你能在使用这些算法时有所收获,同时也欢迎在评论区分享你的想法和经验。
㈢ java中使用国密SM4算法详解
在探讨了加密算法的基本类型及其区别后,我们将通过Java实现SM4算法,这是一种用于无线局域网分组数据的标准加密技术,其特点是采用对称加密,密钥和分组长度均为128位。
在实际项目中,我们通常可以选择直接使用第三方工具包如hutool来简化操作。以下是使用步骤:
然而,自定义密钥时可能会遇到问题,如某小伙伴遇到的报错。需要注意的是,128位的密钥需要转换为16字节进行处理。在此过程中,务必确保密钥的正确转换。
以上内容由作者向彪-fisco bcos在CSDN博客中详细阐述,链接为:https://blog.csdn.net/ws327443752/article/details/109197127,对于实际项目中的应用,推荐参考这篇文章的指导。
㈣ 整点干货!Java技术栈(架构篇+算法篇+大数据)
Java技术栈的架构篇、算法篇和大数据是现代软件开发中的核心组成部分,尤其在企业级应用和大型互联网项目中发挥着关键作用。下面,我们将从这三个方面逐一探讨Java技术栈的深度与广度。
架构篇以Java为核心,涵盖了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库等关键技术。架构设计不仅要考虑系统性能、扩展性、稳定性,还要关注高可用性、安全性等多方面因素。Java在这些领域的深厚积累,使其成为构建高效、稳定系统的基础。
算法篇涉及到机器算法的广泛集合,这些算法在搜索、推荐、广告、库存管理、物流调度、云计算等场景中发挥着关键作用。随着数据量的爆炸性增长,算法优化和效率提升变得至关重要,Java通过其强大的库支持和丰富的生态系统,为开发者提供了实现高效算法的工具。
大数据篇则主要关注Spark、Hadoop等关键技术。在处理海量数据时,这些工具能够实现高效的数据处理、存储和分析,是现代大数据分析的核心。通过Spark等工具,企业可以实现从数据收集、清洗、分析到最终决策的全过程,为业务提供数据驱动的洞察力。
以上内容覆盖了阿里巴巴等大型企业在研发过程中所依赖的技术栈,不仅限于交易、支付场景,还包括客户服务、搜索、推荐、广告、库存、物流、云计算等更广泛的领域。这些技术不仅支撑了阿里巴巴双十一的超级工程,也是企业实现数字化转型、提升竞争力的关键。
从研发篇、算法篇到大数据篇,Java技术栈提供了从底层架构设计到上层应用开发的全面支持,体现了其在现代软件开发领域中的核心地位。通过深入学习和实践这些技术,开发者能够构建出更加高效、可靠和创新的解决方案,为企业和用户带来更大的价值。