複製鏈接
請複製以下鏈接發送給好友

有效字節

鎖定
計算機科學中,有效字節一般是指計算機讀取數據時,計數器所記錄的計數值。如果在一個計數器中計數值的同時,又要往同一個計數器中寫入新的計數值時,如果不注意先後順序,很容易出錯。所以有效字節也可以指最高有效字節和最低有效字節之間的字節。
中文名
有效字節
外文名
Significant Byte
學    科
計算機科學
定    義
最高有效字節與最低有效字節之間
有關術語
最高有效字節、最低有效字節
順    序
與字節序有關
發生時間
處理數據

有效字節簡介

在計算機科學中,有效字節一般是指計算機讀取數據時,計數器所記錄的計數值。如果在一個計數器中計數值的同時,又要往同一個計數器中寫入新的計數值時,如果不注意先後順序,很容易出錯。所以有效字節也可以指最高有效字節和最低有效字節之間的字節。有效字節在計算機進行數據讀取時很重要,特別是計算機進行網絡數據傳輸時,定義有效字節有利於進行數據傳輸雙方正確進行數據傳輸。

有效字節字節序

現代的計算機系統一般採用字節(Octet, 8 bit Byte)作為邏輯尋址單位。當物理單位的長度大於1個字節時,就要區分字節序(Endianness),字節序是指處理器在處理多字節數據時,在寄存器和內存中保存字節的順序。為了簡便起見它的英文也常常表示為 Byte Order。
目前在各種體系的計算機中通常採用的字節存儲機制主要有兩種:Little-Endian 和 Big-Endian。另外還有一種不常用的字節序Middle-Endian,又稱為Mixed-Endian或者PDP-Endian,它是Little-Endian 和 Big-Endian的混合體。
我們常見的大部分處理器都採用Little-Endian,例如x86、6502、Z80、VAX以及PDP-11等;
使用Big-Endian的處理器通常是Motorola的處理器,例如:6800、68000、PowerPC 以及System/370等;像ARM、PowerPC、Alpha、SPARC V9、MIPS、PA-RISC和IA64等體系結構支持可切換的字節序這樣的特性,這個特性可以提高效率或者簡化網絡設備和軟件的邏輯。這種可切換的字節序被稱為Bi-Endian,用於硬件上意指計算機或者傳遞數據時可以使用兩種不同字節序中任意一種的能力。
Middle-Endian 使用很少,偶爾會在一些小型機體系中的十進制數的壓縮格式中出現。
大和小端字節排序
字節順序
含義
大端
大端表示最大的有效字節位於單詞的左端。
小端
大端表示最大的有效字節位於單詞的右端。
通常,您不必擔心您通過網絡發送和接收的數據的字節序列轉換,但必須將字節順序的情況。
當必須將字節順序
需要在以下情況下轉換字節順序:
您需要通過網絡傳遞的信息解釋,而您發送到另一台數據相對的。例如,您可能將端口和網絡地址,必須理解。
您進行的服務器應用不是 MFC 應用程序 (並在沒有它的源代碼)。此調用字節序列轉換,如果兩台計算機不共享同樣字節順序。 [1] 

有效字節最高有效字節與最低有效字節

MSB(Most Significant Byte),最高有效字節,指多字節序列中具有最大權重的字節,是一個數據中權值最大的那一個字節。
LSB(Least Significant Byte),最低有效字節,指多字節序列中最小權重的字節,是一個數據中權值最小的那一個字節。
Big-Endian(BE),是指數據的高字節(MSB)保存在內存的低地址中,而數據的低字節(LSB)保存在內存的高地址中,這樣的存儲模式有點兒類似於把數據當作字符串順序處理:地址由小向大增加,而數據從高位往低位放;Little-Endian(LE),是指數據的高字節(MSB)保存在內存的高地址中,而數據的低字節(LSB)保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。
判斷目標系統的字節序
 

/*
return value    0 : TRUE  (host boyte order is big-endian)    1 : FALSE  
*/
int isBigEndian(
void
){    union {        
int i; 
/*
 at least 16 bit 
*/        
char
 c;    }un;    un.i = 
0x01; 
/*
 0x01 is LSB 
*/    
return (un.c == 
0x01
);}
網絡中字節序轉換
 
#include <netinet/
in.h>
/*
 將主機字節序,轉換成網絡字節序,返回網絡字節序的值 
*/
uint16_t htons(uint16_t host16bitvalue);  /* convert short form host to net */uint32_t htonl(uint32_t host32bitvalue);
/*
 將網絡字節序,轉換成主機字節序,返回主機字節序的值 
*/
unit16_t ntohs(uint16_t net16bitvalue);uint32_t ntohl(uint32_t net32bitvalue);
參考資料