电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java中的byte & 0xff到底有什么作用?

瀏覽:35日期:2022-08-10 08:41:26

如果寫過通信類的代碼,比如socket編程,應該對這個問題不陌生。

先說結論

byte & 0xff 是將byte從(-128 至 127)轉化成 int(轉化后的數值范圍: 0 至 255)。

其實就是1個byte有兩種表示方法,我們既可以用-128 - 127這段范圍來表示一個字節,也可以用 0 - 255這個范圍的數來表示一個字節。

看一個demo

用Java中的InetAddress類來獲取我當前的ip

public class InetAddressTest { public static void main(String[] args) throws UnknownHostException {InetAddress localHost = InetAddress.getLocalHost();byte[] address = localHost.getAddress();for (byte b : address) { System.out.print(b + ' ');} }}

輸出結果

-64 -88 2 119

本機ip

Java中的byte & 0xff到底有什么作用?

好像不太一樣,我們ip地址只用 0 - 255來表示,不會出現負數。

所以再換一種寫法,將取出來的字節 & 0xff

public class InetAddressTest { public static void main(String[] args) throws UnknownHostException {InetAddress localHost = InetAddress.getLocalHost();byte[] address = localHost.getAddress();for (byte b : address) { System.out.print( ( b & 0xff ) + ' ');} }}

結果

192 168 2 119

Process finished with exit code 0

果然就是我們想要的結果

為什么需要轉換

因為Java中的byte是有符號的,他的范圍只能是 -128 - 127。

我們在使用tcp等協議的時候,首先要把傳輸的消息轉化成字節流,然后再傳輸,在編程語言中字節流通常用十進制的byte數組來表示。

Java中的byte & 0xff到底有什么作用?

假如我們就想用 0-255來表示一個字節,不想用負數,該怎么辦呢?

可惜Java中沒有 無符號字節(unsigned byte), 我們只能用 int 來存儲0-255。

而int的范圍是(-2^31 ~ 2^31-1),只用了256個,剩下的空間都被浪費了,得不償失啊。

所以我們存儲的時候、傳輸的時候可以用byte,但是使用的時候就需要做一個轉換了,那為什么0xff就可以得到無符號byte呢。

& 0xff的作用

作為一個十六進制數,0xff在Java中是用什么類型存儲的呢?

Java中的byte & 0xff到底有什么作用?

應該顯而易見吧,0xff是整型。

假設我現在要轉化 字節 -1

-1的原碼、反碼、補碼分別如下:

原碼 1 0 0 0 0 0 0 1反碼 0 1 1 1 1 1 1 0補碼 0 1 1 1 1 1 1 1

現在和 0xff做運算, ff 就是(1111 11111),而因為他是整型,占4個字節,32為,所以0Xff的前面還有24個0。

用 -1 的補碼進行計算

-1 0 1 1 1 1 1 1 10xff 000000000 000000000 000000000 1 1 1 1 1 1 1 1=000000000 000000000 000000000 0 1 1 1 1 1 1 1=255

其實在Java中,”任何數 & 0Xff等于那個數本身“ 這句話就顯得不那么正確了

”任意整型 & 0xff = 本身“ 是沒有問題的

但是字節 & 0xff 就被拖到了另一個次元,從byte進化成了int。

關于byte[ ] & 0xFF的問題

最近在寫有關SHA256加密解密的問題,發現有一段代碼是這樣的,處于好奇理解了一下。

private static String byte2Hex(byte[] bytes){ StringBuffer stringBuffer = new StringBuffer(); String temp = null; for (int i=0;i<bytes.length;i++){ temp = Integer.toHexString(bytes[i] & 0xFF); if (temp.length()==1){ //1得到一位的進行補0操作 stringBuffer.append('0'); } stringBuffer.append(temp); } return stringBuffer.toString(); }

Integer類中toHexString方法的參數是int類型,為什么byte[ ] & 0xFF可以表示int類型呢?

byte[i]是8位二進制,0xFF轉化為8位二進制為11111111,& 之后的結果還是本身啊,這是怎么回事?

我們都知道計算機內的存儲都是利用二進制的補碼進行存儲的。

復習一下,原碼反碼補碼這三個概念

對于一個字節的最高位,計算機中是有規定的,正數的最高位為0,負數的最高位為1。

對于正數(00000001)原碼來說,首位表示符號位,反碼 補碼都是本身

對于負數(100000001)原碼來說,反碼是對原碼除了符號位之外作取反運算即(111111110),補碼是對反碼作+1運算即(111111111)

下面寫段代碼測試下

public static void main(String[] args) { byte[] a=new byte[10]; a[0]=-127; System.out.println('a[0]:'+a[0]); int b=a[0] & 0xFF; System.out.println('b:'+b); }

得到的結果為:

a[0]:-127

b:129

現在針對這個結果進行分析:

byte類型的a[0]的值為-127,在計算機中存儲的補碼為:10000001,這個補碼是8位的,而int類型是32位的,所以a[0]作為int類型來輸出的時候jvm給做了個補位便成了 111111111111111111111111 10000001(-127),雖然補碼轉換了,但是這兩個補碼表示的十進制數字是相同的。

為了保證二進制數據的一致性,當byte要轉化為int的時候,高的24位必然會補1,這樣,其二進制補碼其實已經不一致了,如果二進制被當作byte和int來解讀,其10進制的值必然是不同的,因為符號位位置已經發生了變化,而&0xFF可以將高的24位置為0,低8位保持原樣。

int b = a[0]&0xff; a[0]&0xff=1111111111111111111111111 10000001&11111111=000000000000000000000000 10000001 ,這個值就是129

所以最后顯示的b的值為129

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 青岛美佳乐清洁工程有限公司|青岛油烟管道清洗|酒店|企事业单位|学校工厂厨房|青岛油烟管道清洗 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 兰州牛肉面加盟,兰州牛肉拉面加盟-京穆兰牛肉面 | pH污水传感器电极,溶解氧电极传感器-上海科蓝仪表科技有限公司 | 雄松华章(广州华章MBA)官网-专注MBA/MPA/MPAcc/MEM辅导培训 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 无锡门窗-系统门窗-阳光房-封阳台-断桥铝门窗厂[窗致美] | 热风机_工业热风机生产厂家上海冠顶公司提供专业热风机图片价格实惠 | 护栏打桩机-打桩机厂家-恒新重工 | 福建省教师资格证-福建教师资格证考试网 | 写方案网_方案策划方案模板下载 事迹材料_个人事迹名人励志故事 | 湖南档案密集架,智能,物证,移动,价格-湖南档案密集架厂家 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 不锈钢反应釜,不锈钢反应釜厂家-价格-威海鑫泰化工机械有限公司 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 熔体泵_熔体出料泵_高温熔体泵-郑州海科熔体泵有限公司 | 中细软知识产权_专业知识产权解决方案提供商 | 外贸资讯网 - 洞悉全球贸易,把握市场先机| 郑州水质检测中心_井水检测_河南废气检测_河南中环嘉创检测 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 防潮防水通风密闭门源头实力厂家 - 北京酷思帝克门窗 | 油冷式_微型_TDY电动滚筒_外装_外置式电动滚筒厂家-淄博秉泓机械有限公司 | 山东成考网-山东成人高考网| R507制冷剂,R22/R152a制冷剂厂家-浙江瀚凯制冷科技有限公司 | 楼承板设备-楼承板成型机-免浇筑楼承板机器厂家-捡来 | 国产液相色谱仪-超高效液相色谱仪厂家-上海伍丰科学仪器有限公司 | 洁净棚-洁净工作棚-无菌室-净化工程公司_北京卫护科技有限公司 | 板式换热器_板式换热器价格_管式换热器厂家-青岛康景辉 | 美缝剂_美缝剂厂家_美缝剂加盟-地老板高端瓷砖美缝剂 | 周口风机|周风风机|河南省周口通用风机厂 |