java小端
Ⅰ 大端模式和小端模式
具體如下:
1、大端模式:
大端模式,是指數據的高位,保存在內存的低地址中,而數據的低位,保存在內存的高地址中,這樣的存儲模式類似於把數據當作字元串順序處理。
地址由小向大增加,而數據從高位往低位放;小端模式,是指數據的高位保存在內存的高地址中,而數據的低位保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。
在大端模式下,前16位應該這樣讀: e6 84 6c 4e ( 假設int佔4個位元組)。
記憶方法: 地址的增長順序與值的增長順序相反。
2、小端模式例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000。
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000。
在小端模式下,前16位應該這樣讀: 4e 6c 84 e6( 假設int佔4個位元組)。
記憶方法: 地址的增長順序與值的增長順序相同。
大小端模式:
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為 8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於 8位的處理器。
例如16位或者32位的處理器,由於寄存器寬度大於一個位元組,那麼必然存在著一個如何將多個位元組安排的問題。因此就導致了大端存儲模式和小端存儲模式。例如一個16bit的short型x,在內存中的地址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。
對於 大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬體來選擇是大端模式還是小端模式。
Ⅱ 大端模式和小端模式的區別及如何判斷的存儲器的模式
一個數需要超過一個位元組來存儲時,就有大端和小端的區別,只用一個位元組時,無所謂大小端
低位的放在低地址,也就是小個在前,叫小端,反之叫大端
c和c++需要面對這樣的問題,java等高級語言已經屏蔽這個差異,不需要額外處理
在c中,可以用以下代碼片段來判斷是大端還是小端
union {char c; int i;} u;
u.i = 1;
if(u.c == 1){//小端}
else{//大端}
Ⅲ c語言和java 使用socket通信的時候 數據大小端轉換的問題
大小端轉換就是移位,拼接,用C實現很簡單。
至於解析出問題,可以約定雙方以位元組流進行通信,比如,約定一個浮點數拆成文本,或者一個32位長整拆成四個位元組,先傳送低位元組(或高位元組),約定好以後,兩邊都照做就可以了。
Ⅳ java如何將 byte [4] 轉換到float
推薦答案是錯誤地把位元組等同與字元。
byte b[]={0x41,(byte) 0xc8,0,0};
//方法1 流輸入,適用於ME/SE環境
//默認大端數,如果小端數,可以先翻轉數組
DataInputStream dis=new DataInputStream(new ByteArrayInputStream(b));
float f=dis.readFloat();
dis.close();
System.out.println(f);
//方法2 緩存輸入,適用於SE/EE環境
ByteBuffer buf=ByteBuffer.allocateDirect(4); //無額外內存的直接緩存
//buf=buf.order(ByteOrder.LITTLE_ENDIAN);//默認大端,小端用這行
buf.put(b);
buf.rewind();
float f2=buf.getFloat();
System.out.println(f2);
都將顯示讀出來的浮點數25.0
Ⅳ java網路編程是大端還是小端
網路傳輸中採用的大端標記法,也就是說先傳比較高權值的數游漏字, 就像 12一樣,先傳10,在傳2,就算丟了後面一個,損失也不是太大。
小端就跟機器有關了。你在封裝一個int之類的數字,封裝進去之後就應該是大端的了,可以調用裡面的 htons() 或者htonl()函數來轉化成大端的(當然你也可以自己按照大端的方式封裝,就會麻煩一點而已)。傳輸過程世褲中當然也是大端的,接受到的buffer裡面當然也是大端的,但是你在讀取這個int類型的時候,就需要相應的將大端轉化為小端了(採用ntohs() 函數或ntohl()函數來實現),這樣你讀取到的就是原來的數字。
可想而知,假如你用機器A和B通信,而且A和B的端序都是一樣的話,中間自然就不用轉換來轉神返爛換去了。但是這不是好習慣,因為假如移植到另外端序的機器的話就需要修改代碼笭害蒂轎酈計墊襲叮陋。所以最好還是用那幾個函數。
Ⅵ java如何將byte類型數組變成int類型的數組
每4個byte轉化成一個int,使用位運算,大致如下
大端序:
int[i]=byte[4*i]<<24|byte[4*i+1]<<16|byte[4*i+2]<<8|byte[4*i+3];
小端序:
int[i]=byte[4*i]|byte[4*i+1]<<8|byte[4*i+2]<<16|byte[4*i+3]<<24;