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技術棧提供了從底層架構設計到上層應用開發的全面支持,體現了其在現代軟體開發領域中的核心地位。通過深入學習和實踐這些技術,開發者能夠構建出更加高效、可靠和創新的解決方案,為企業和用戶帶來更大的價值。