『壹』 java 讀取byte[] 指定位元組
public abstract int read() throws IOException
從輸入流中讀取數據的下一個位元組。返回 0 到 255 范圍內的 int
位元組值。如果因為已經到達流末尾而沒有可用的位元組,則返回值 -1。在輸入數據可用、檢測到流末尾或者拋出異常前,此方法一直阻塞。
子類必須提供此方法的一個實現。
還有下面兩個方法可選,具體的API說明查找java.io.InputStream的說明。
public int read(byte[] b) throws IOException
public int read(byte[] b,int off, int len) throws IOException
位元組轉整數時注意高地位。
『貳』 java怎麼對bytes數組進行位操作,例如取出buf是bytes數組,怎麼取出bytes[0]一個位元組裡面的前4位
//byte buf[]=為數組
for(byte b:buf){
System.out.print(b&15);//列印每個節的低四位
System.out.println(b>>>4);//列印每個節的高四位
}
『叄』 java Byte.parseByte方法
這個地方int radix 是指的基數 ,就是指的進制基數
比如你的例子中
b[0] = Byte.parseByte("11", 2) = 3
表示 字元串11以2為基數表示為10進制的byte值是 3 ,這里的11表示的是一個2進制數
b[0] = Byte.parseByte("11", 3) = 4
表示 字元串11以3為基數表示為10進制的byte值是 4 ,這里的11表示的是一個3進制數
如果你給的string 不能轉換,或者基數小於2或大於36 會拋出異常
如
b[0] = Byte.parseByte("12", 2) // 2 進制中只有1和0
b[0] = Byte.parseByte("12", 1) // 基數應該在 1<radix<37
『肆』 什麼是Java位元組碼
它是程序的一種低級表示,可以運行於Java虛擬機上。將程序抽象成位元組碼可以保證Java程序在各種設備上的運行
Java號稱是一門「一次編譯到處運行」的語言,從我們寫的java文件到通過編譯器編譯成java位元組碼文件(.class文件),這個過程是java編譯過程;而我們的java虛擬機執行的就是位元組碼文件。不論該位元組碼文件來自何方,由哪種編譯器編譯,甚至是手寫位元組碼文件,只要符合java虛擬機的規范,那麼它就能夠執行該位元組碼文件。
JAVA程序的運行
因為Java具有跨平台特性,為了實現這個特性Java執行在一台虛擬機上,這台虛擬機也就是JVM,Java通過JVM屏蔽了不同平台之間的差異,從而做到一次編譯到處執行。JVM位於Java編譯器和OS平台之間,Java編譯器只需面向JVM,生成JVM能理解的代碼,這個代碼即位元組碼,JVM再將位元組碼翻譯成真實機器所能理解的二進制機器碼。
位元組碼是怎麼產生的?
我們所編寫的程序都是.java格式,通常在執行的時候也許點擊一下eclipse的運行鍵就可以在控制台看到運行結果,但是也可以更酷一些,如果你裝了JDK,那就可以直接在以命令行的方式編譯運行你的.java文件,編譯後會形成.class文件,這個.class文件即位元組碼。
位元組碼怎麼解讀?
上圖是編譯好的位元組碼文件,即一堆16進制的位元組,如果使用IDE去打開,也許看到的是已經被反編譯的我們所熟悉的java代碼,但這才是純正的位元組碼
這里只介紹位元組碼由哪些部分組成, 具體的意思自行網路或者看文尾的連接, 有較為詳細的講解
上圖即位元組碼文件的組成部分, Class文件的結構不像XML等描述語言那樣鬆散自由。由於它沒有任何分隔符號,
所以,以上數據項無論是順序還是數量都是被嚴格限定的。哪個位元組代表什麼含義,長度是多少,先後順序如何,都不允許改變, 如上圖左側即每一部分規定的長度
魔數(Magic Number)
魔數是用來區分文件類型的一種標志,一般都是用文件的前幾個位元組來表示。
比如0XCAFE BABE表示的是class文件,那麼有人會問,文件類型可以通過文件名後綴來判斷啊?是的,但是文件名是可以修改的(包括後綴),那麼為了保證文件的安全性,將文件類型寫在文件內部來保證不被篡改。
至於為什麼是CAFE BABE估計大家也能猜到, 程序員與咖啡的不解之緣
版本號(Version)
版本號含主版本號和次版本號,都是各佔2個位元組。在此Demo種為0X0000 0033。其中前面的0000是次版本號,後面的0033是主版本號。通過進制轉換得到的是次版本號為0,主版本號為51。高版本的JDK能向下兼容以前版本的Class文件,但不能運行以後版本的Class文件,即使文件格式未發生任何變化. 這就是target參數的用處,可以在使用JDK 1.7編譯時指定-target 1.5
常量池(Constant Pool)
常量池是Class文件中的資源倉庫, 量池中主要存儲2大類常量:字面量和符號引用。字面量如文本字元串,java中聲明為final的常量值等等,而符號引用如類和介面的全局限定名,欄位的名稱和描述符,方法的名稱和描述符。常量池是一個表結構,在表的內容前有一個類型的計數器,表示常量池的長度
上面的表中描述了11中數據類型的結構,其實在jdk1.7之後又增加了3種(CONSTANT_MethodHandle_info,CONSTANT_MethodType_info以及CONSTANT_InvokeDynamic_info)。這樣算起來一共是14種
訪問標志(Access_Flag)
訪問標志信息包括該Class文件是類還是介面,是否被定義成public,是否是abstract,如果是類,是否被聲明成final。通過上面的源代碼,我們知道該文件是類並且是public。
0x 00 21:是0×0020和0×0001的並集。其中0×0020這個標志值涉及到位元組碼指令
類索引(This Class Name)
類索引用於確定類的全限定名
0×00 03 表示引用第3個常量,同時第3個常量引用第19個常量,查找得」com/demo/Demo」。#3.#19
父類索引(Super Class Name)
0×00 04 同理:#4.#20(java/lang/Object)
介面索引(Interfaces)
通過上邊位元組碼圖可以看到,這個介面有2+n個位元組,前兩個位元組表示的是介面數量,後面跟著就是介面的表。我們這個類沒有任何介面,所以應該是0000。果不其然,查找位元組碼文件得到的就是0000。
欄位表集合(fields)
欄位表用於描述類和介面中聲明的變數。這里的欄位包含了類級別變數以及實例變數,但是不包括方法內部聲明的局部變數。接下來就是2+n個欄位屬性。我們只有一個屬性a,所以應該是0001。查找文件果不其然是0001。
該區域含有欄位的訪問標志, 訪問許可權, 欄位的名稱索引, 欄位的描述符索引, 屬性表
描述符的作用就是用來描述欄位的數據類型、方法的參數列表和返回值。而屬性表就是為欄位表和方法表提供額外信息的表結構。對於欄位來說,此處如果將欄位聲明為一個static final msg = "aaa"的常量,則欄位後就會跟著一個屬性表,其中存在一項名為ConstantValue,指向常量池中的一個常量,值為的"aaa"。
方法(methods)
包含訪問標志表, 方法名索引 , 方法描述符索引, 屬性表數量,等
Attribute
0×0001 :同樣的,表示有1個Attributes了。
0x000f : #15(「SourceFile」)
0×0000 0002 attribute_length=2
0×0010 : sourcefile_index = #16(「Demo.java」)
SourceFile屬性用來記錄生成該Class文件的源碼文件名稱。
『伍』 java中獲取byte[]的值
沒看明白,讓我猜一下:
現有打包後的數據,你想根據這個獲取打包前的原始數據?
如果是這樣的話,就得知道builderPacketHead()這個方法怎麼實現功能的。
沒有builderPacketHead源碼的話那就沒辦法了,除非你運氣好能猜到。
有源碼也不一定能獲取原始數據,對稱加密方法很多而且很多不可逆轉,非對稱加密更麻煩。。。
『陸』 java中如何用位元組數組查找字元串中字元的位置
import javax.swing.*;
public class Example4_3
{
public static void main(String[] args)
{
byte d[]="我們正在教室上課".getBytes();
String s=new String(d,8,4);
JOptionPane.showMessageDialog(null,"第8個字元位置開始的兩個漢字:"+s);
}
}
『柒』 JAVA中byte類型的介紹。 謝謝
1、在Java中,byte類型的數據是8位帶符號的二進制數。最高位表示正負,0為正,1為負。
2、java byte是做為最小的數字來處理的,因此它的值域被定義為-128~127,也就是signed byte。
3、正數的最高位都是 0 ,正數的值就是二進製表示的值。
4、負數的最高位都是 1 ,負數的值是 取反後加一 然後加個負號得到的值。
(7)javabyte查找擴展閱讀
1、java基本數據類型
JAVA中一共有八種基本數據類型,分別是byte、short、int、long、float、double、char、boolean。
2、java各數據類型取值范圍
byte,整型,1個位元組,范圍:-2的7次方 ~ 2的7次方-1;
short,整型,2個位元組,范圍:-2的15次方 ~ 2的15次方-1;
int,整型,4個位元組,范圍:-2的31次方 ~ 2的31次方-1;
long,整型,8個位元組,范圍:-2的63次方 ~ 2的63次方-1;
float,浮點型,4個位元組,范圍:3.402823e+38 ~ 1.401298e-45;
double,浮點型,8個位元組,范圍:1.797693e+308~ 4.9000000e-324;
char,文本型,2個位元組,范圍:0~2的16次方-1;
boolean,布爾型,1個位元組,范圍:true/false;
參考資料
網路-java字元型
『捌』 java將byte數組中的中間一部分值取出來怎麼做啊
如果以這種方式存儲,那麼一定是定長字元串,byte[]是以位元組來存儲的,你直接取規則的長度就行了啊
如下:
byte[] b = new byte[10];
b[0]='a';
b[1]='b';
b[2]='c';
b[3]='d';
String a = new String(b,0,2);
用你的例子來說:比如你的標志是5位的,編號12位,日期20位,測量值10位
那麼應該是
String bz = new String(b,0,5);
String bh = new String(b,5,12);
...............
以此方式解析
『玖』 java中byte的用法
byte最大范圍是127你給個222它能吃的下嘛,它就給你來了個強制轉換,就-34了
『拾』 java中byte是什麼類型
java中byte是位元組型。
java byte作為最小的數字來處理的,因此它的值域被定義為-128~127,byte的用作計數的時間遠少於用表達基本內存單元的時間。
比如從stream里讀入一個雙位元組字元,我們先收到2個byte。為了把byte轉換成適當的形式,需要對byte值做一些比較,比如判斷字元集要比較其是否在某個編碼范圍內。
(10)javabyte查找擴展閱讀:
Java看起來設計得很像C++,但是為了使語言小和容易熟悉,設計者們把C++語言中許多可用的特徵去掉了,這些特徵是一般程序員很少使用的。
例如,Java不支持go to語句,代之以提供break和continue語句以及異常處理。Java還剔除了C++的操作符過載(overload)和多繼承特徵,並且不使用主文件,免去了預處理程序。