java奇偶校驗代碼 java奇偶數(shù)判斷代碼

如何用java獲得字符串的ASCII值

用java獲得字符串的ASCII值:

創(chuàng)新互聯(lián)公司成立于2013年,先為巴州等服務(wù)建站,巴州等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為巴州企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

字符串是沒有ascII的,需要就必須一個個的獲取每個字符的值,主要代碼如下:

public?static?void?main(String?[]args){

String?s?=?"這是一個測試";

for(int?i=0;is.length();i++){????????

System.out.println(+s.charAt(i));

}??

}

Java程序——奇偶校驗

debug跟應(yīng)該能看出來。

?=[0-9] 這個正則表達式的規(guī)則是取每一個數(shù)字的前一位,第一個是數(shù)字取到空了,要處理下第一位。

應(yīng)該就是這個問題了

編程技巧:Java串口通信簡介

嵌入式系統(tǒng)或傳感器網(wǎng)絡(luò)的很多應(yīng)用和測試都需要通過PC機與嵌入式設(shè)備或傳感器節(jié)點進行通信 其中 最常用的接口就是RS 串口和并口(鑒于USB接口的復(fù)雜性以及不需要很大的數(shù)據(jù)傳輸量 USB接口用在這里還是顯得過于奢侈 況且目前除了SUN有一個支持USB的包之外 我還沒有看到其他直接支持USB的Java類庫) SUN的CommAPI分別提供了對常用的RS 串行端口和IEEE 并行端口通訊的支持 RS C(又稱EIA RS C 以下簡稱RS )是在 年由美國電子工業(yè)協(xié)會(EIA)聯(lián)合貝爾系統(tǒng) 調(diào)制解調(diào)器廠家及計算機終端生產(chǎn)廠家共同制定的用于串行通訊的標準 RS 是一個全雙工的通訊協(xié)議 它可以同時進行數(shù)據(jù)接收和發(fā)送的工作

常見的Java串口包

目前 常見的Java串口包有SUN在 年發(fā)布的串口通信API m jar(Windows下) m jar(Linux/Solaris);IBM的串口通信API以及一個開源的實現(xiàn) 鑒于在Windows下SUN的API比較常用以及IBM的實現(xiàn)和SUN的在API層面都是一樣的 那個開源的實現(xiàn)又不像兩家大廠的產(chǎn)品那樣讓人放心 這里就只介紹SUN的串口通信API在Windows平臺下的使用

串口包的安裝(Windows下)

到SUN的網(wǎng)站下載javam win zip 包含的東西如下所示

按照其使用說明(l)的說法 要想使用串口包進行串口通信 除了設(shè)置好環(huán)境變量之外 還要將win dll復(fù)制到 \bin目錄下;將m jar復(fù)制到 \lib;把m properties也同樣拷貝到 \lib目錄下 然而在真正運行使用串口包的時候 僅作這些是不夠的 因為通常當運行 java MyApp 的時候 是由JRE下的虛擬機啟動MyApp的 而我們只復(fù)制上述文件到JDK相應(yīng)目錄下 所以應(yīng)用程序?qū)崾菊也坏酱?解決這個問題的方法很簡單 我們只須將上面提到的文件放到JRE相應(yīng)的目錄下就可以了

值得注意的是 在網(wǎng)絡(luò)應(yīng)用程序中使用串口API的時候 還會遇到其他更復(fù)雜問題 有興趣的話 你可以查看CSDN社區(qū)中 關(guān)于網(wǎng)頁上Applet用javam 讀取客戶端串口的問題 的帖子

串口API概覽

m CommPort

這是用于描述一個被底層系統(tǒng)支持的端口的抽象類 它包含一些高層的IO控制方法 這些方法對于所有不同的通訊端口來說是通用的 SerialPort 和ParallelPort都是它的子類 前者用于控制串行端口而后者用于控這并口 二者對于各自底層的物理端口都有不同的控制方法 這里我們只關(guān)心SerialPort

m CommPortIdentifier

這個類主要用于對串口進行管理和設(shè)置 是對串口進行訪問控制的核心類 主要包括以下方法

l 確定是否有可用的通信端口

l 為IO操作打開通信端口

l 決定端口的所有權(quán)

l 處理端口所有權(quán)的爭用

l 管理端口所有權(quán)變化引發(fā)的事件(Event)

m SerialPort

這個類用于描述一個RS 串行通信端口的底層接口 它定義了串口通信所需的最小功能集 通過它 用戶可以直接對串口進行讀 寫及設(shè)置工作

串口API實例

大段的文字怎么也不如一個小例子來的清晰 下面我們就一起看一下串口包自帶的例子 SerialDemo中的一小段代碼來加深對串口API核心類的使用方法的認識

列舉出本機所有可用串口

void?listPortChoices()?{ CommPortIdentifier?portId; Enumeration?en?=?CommPortIdentifier getPortIdentifiers(); //?iterate?through?the?ports while?(en hasMoreElements())?{ portId?=?(CommPortIdentifier)?en nextElement(); if?(portId getPortType()?==?CommPortIdentifier PORT_SERIAL)?{ System out println(portId getName()); } } portChoice select(parameters getPortName()); }

以上代碼可以列舉出當前系統(tǒng)所有可用的串口名稱 我的機器上輸出的結(jié)果是 和

串口參數(shù)的配置

串口一般有如下參數(shù)可以在該串口打開以前配置進行配置

包括波特率 輸入/輸出流控制 數(shù)據(jù)位數(shù) 停止位和齊偶校驗

SerialPort?sPort; try?{ sPort setSerialPortParams(BaudRate Databits Stopbits Parity); //設(shè)置輸入/輸出控制流 sPort setFlowControlMode(FlowControlIn?|?FlowControlOut); }?catch?(UnsupportedCommOperationException?e)?{}

串口的讀寫

對串口讀寫之前需要先打開一個串口

CommPortIdentifier?portId?=?CommPortIdentifier getPortIdentifier(PortName); try?{ SerialPort?sPort?=?(SerialPort)?portId open( 串口所有者名稱 ?超時等待時間); }?catch?(PortInUseException?e)?{//如果端口被占用就拋出這個異常 throw?new?SerialConnectionException(e getMessage()); } //用于對串口寫數(shù)據(jù) OutputStream?os?=?new?BufferedOutputStream(sPort getOutputStream()); os write(int?data); //用于從串口讀數(shù)據(jù) InputStream?is?=?new?BufferedInputStream(sPort getInputStream()); int?receivedData?=?is read();

讀出來的是int型 你可以把它轉(zhuǎn)換成需要的其他類型

這里要注意的是 由于Java語言沒有無符號類型 即所有的類型都是帶符號的 在由byte到int的時候應(yīng)該尤其注意 因為如果byte的最高位是 則轉(zhuǎn)成int類型時將用 來占位 這樣 原本是 的byte類型的數(shù)變成int型就成了 這是很嚴重的問題 應(yīng)該注意避免

串口通信的通用模式及其問題

終于嘮叨完我最討厭的基礎(chǔ)知識了 下面開始我們本次的重點 串口應(yīng)用的研究 由于向串口寫數(shù)據(jù)很簡單 所以這里我們只關(guān)注于從串口讀數(shù)據(jù)的情況 通常 串口通信應(yīng)用程序有兩種模式 一種是實現(xiàn)SerialPortEventListener接口 監(jiān)聽各種串口事件并作相應(yīng)處理;另一種就是建立一個獨立的接收線程專門負責(zé)數(shù)據(jù)的接收 由于這兩種方法在某些情況下存在很嚴重的問題(至于什么問題這里先賣個關(guān)子J) 所以我的實現(xiàn)是采用第三種方法來解決這個問題

事件監(jiān)聽模型

現(xiàn)在我們來看看事件監(jiān)聽模型是如何運作的

l 首先需要在你的端口控制類(例如SManager)加上 implements SerialPortEventListener

l 在初始化時加入如下代碼

try?{ SerialPort?sPort addEventListener(SManager); }?catch?(TooManyListenersException?e)?{ sPort close(); throw?new?SerialConnectionException( too?many?listeners?added ); } sPort notifyOnDataAvailable(true);

l 覆寫public void serialEvent(SerialPortEvent e)方法 在其中對如下事件進行判斷

BI 通訊中斷

CD 載波檢測

CTS 清除發(fā)送

DATA_AVAILABLE 有數(shù)據(jù)到達

DSR 數(shù)據(jù)設(shè)備準備好

FE 幀錯誤

OE 溢位錯誤

OUTPUT_BUFFER_EMPTY 輸出緩沖區(qū)已清空

PE 奇偶校驗錯

RI  振鈴指示

一般最常用的就是DATA_AVAILABLE 串口有數(shù)據(jù)到達事件 也就是說當串口有數(shù)據(jù)到達時 你可以在serialEvent中接收并處理所收到的數(shù)據(jù) 然而在我的實踐中 遇到了一個十分嚴重的問題

首先描述一下我的實驗 我的應(yīng)用程序需要接收傳感器節(jié)點從串口發(fā)回的查詢數(shù)據(jù) 并將結(jié)果以圖標的形式顯示出來 串口設(shè)定的波特率是 川口每隔 毫秒返回一組數(shù)據(jù)(大約是 字節(jié)左右) 周期(即持續(xù)時間)為 秒 實測的時候在一個周期內(nèi)應(yīng)該返回 多個字節(jié) 而用事件監(jiān)聽模型我最多只能收到不到 字節(jié) 不知道這些字節(jié)都跑哪里去了 也不清楚到底丟失的是那部分數(shù)據(jù) 值得注意的是 這是我將serialEvent()中所有處理代碼都注掉 只剩下打印代碼所得的結(jié)果 數(shù)據(jù)丟失的如此嚴重是我所不能忍受的 于是我決定采用其他方法

串口讀數(shù)據(jù)的線程模型

這個模型顧名思義 就是將接收數(shù)據(jù)的操作寫成一個線程的形式:

public?void?startReadingDataThread()?{ Thread?readDataProcess?=?new?Thread(new?Runnable()?{ public?void?run()?{ while?(newData?!=? )?{ try?{ newData?=?is read(); System out println(newData); //其他的處理過程 ……… }?catch?(IOException?ex)?{ System err println(ex); return; } } readDataProcess start(); }

在我的應(yīng)用程序中 我將收到的數(shù)據(jù)打包放到一個緩存中 然后啟動另一個線程從緩存中獲取并處理數(shù)據(jù) 兩個線程以生產(chǎn)者—消費者模式協(xié)同工作 數(shù)據(jù)的流向如下圖所示

這樣 我就圓滿解決了丟數(shù)據(jù)問題 然而 沒高興多久我就又發(fā)現(xiàn)了一個同樣嚴重的問題 雖然這回不再丟數(shù)據(jù)了 可是原本一個周期( 秒)之后 傳感器節(jié)電已經(jīng)停止傳送數(shù)據(jù)了 但我的串口線程依然在努力的執(zhí)行讀串口操作 在控制臺也可以看見收到的數(shù)據(jù)仍在不斷的打印 原來 由于傳感器節(jié)點發(fā)送的數(shù)據(jù)過快 而我的接收線程處理不過來 所以InputStream就先把已到達卻還沒處理的字節(jié)緩存起來 于是就導(dǎo)致了明明傳感器節(jié)點已經(jīng)不再發(fā)數(shù)據(jù)了 而控制臺卻還能看見數(shù)據(jù)不斷打印這一奇怪的現(xiàn)象 唯一值得慶幸的是最后收到數(shù)據(jù)確實是 左右字節(jié) 沒出現(xiàn)丟失現(xiàn)象 然而當處理完最后一個數(shù)據(jù)的時候已經(jīng)快 分半鐘了 這個時間遠遠大于節(jié)點運行周期 這一延遲對于一個實時的顯示系統(tǒng)來說簡直是災(zāi)難!

后來我想 是不是由于兩個線程之間的同步和通信導(dǎo)致了數(shù)據(jù)接收緩慢呢?于是我在接收線程的代碼中去掉了所有處理代碼 僅保留打印收到數(shù)據(jù)的語句 結(jié)果依然如故 看來并不是線程間的通信阻礙了數(shù)據(jù)的接收速度 而是用線程模型導(dǎo)致了對于發(fā)送端數(shù)據(jù)發(fā)送速率過快的情況下的數(shù)據(jù)接收延遲 這里申明一點 就是對于數(shù)據(jù)發(fā)送速率不是如此快的情況下前面者兩種模型應(yīng)該還是好用的 只是特殊情況還是應(yīng)該特殊處理

第三種方法

痛苦了許久(Boss天天催我L)之后 偶然的機會 我聽說TinyOS中(又是開源的)有一部分是和我的應(yīng)用程序類似的串口通信部分 于是我下載了它的 x版的Java代碼部分 參考了它的處理方法 解決問題的方法說穿了其實很簡單 就是從根源入手 根源不就是接收線程導(dǎo)致的嗎 那好 我就干脆取消接收線程和作為中介的共享緩存 而直接在處理線程中調(diào)用串口讀數(shù)據(jù)的方法來解決問題(什么 為什么不把處理線程也一并取消? 都取消應(yīng)用程序界面不就鎖死了嗎?所以必須保留)于是程序變成了這樣

public?byte[]?getPack(){ while?(true)?{ //?PacketLength為數(shù)據(jù)包長度 byte[]?msgPack?=?new?byte[PacketLength]; for(int?i?=? ;?i??PacketLength;?i++){ if(?(newData?=?is read())?!=? ){ msgPack[i]?=?(byte)?newData; System out println(msgPack[i]); } } return?msgPack; } }

在處理線程中調(diào)用這個方法返回所需要的數(shù)據(jù)序列并處理之 這樣不但沒有丟失數(shù)據(jù)的現(xiàn)象行出現(xiàn) 也沒有數(shù)據(jù)接收延遲了 這里唯一需要注意的就是當串口停止發(fā)送數(shù)據(jù)或沒有數(shù)據(jù)的時候is read()一直都返回 如果一旦在開始接收數(shù)據(jù)的時候發(fā)現(xiàn) 就不要理它 繼續(xù)接收 直到收到真正的數(shù)據(jù)為止

結(jié)束語

lishixinzhi/Article/program/Java/hx/201311/26605

java怎么判斷一個數(shù)是奇數(shù)還是偶數(shù)

能夠被2整除的整數(shù)是偶數(shù),不能被2整除的是奇數(shù)。

i % 2 == 1 ? "奇數(shù)" : "偶數(shù)";

以上程序如果i為負數(shù)結(jié)果為偶數(shù)。

Java取余(%)算法代碼如下:

// dividend被除數(shù) divisor 除數(shù)public static int remainder(int dividend, int divisor){ ? ?return dividend - dividend / divisor * divisor;}

所以當輸入 -1時 運算結(jié)果是-1,當然不等于1了,所以它被判定為偶數(shù)了。

因為改為判斷是否是偶數(shù)即可

i % 2 == 0 ? "偶數(shù)" : "奇數(shù)";

Java是一種可以撰寫跨平臺應(yīng)用程序的面向?qū)ο蟮某绦蛟O(shè)計語言。Java?技術(shù)具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心、游戲控制臺、科學(xué)超級計算機、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群。

標題名稱:java奇偶校驗代碼 java奇偶數(shù)判斷代碼
網(wǎng)站地址:http://muchs.cn/article34/dophjpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司網(wǎng)站收錄、網(wǎng)站建設(shè)、小程序開發(fā)、Google、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)