⑴ 電腦開機自檢順序是什麼
自檢測過程大致為:加電-CPU-ROM-BIOS-System Clock-DMA-64KB RAM-IRQ-顯卡-VGA介面-鍵盤-硬碟-並行口(列印機)和串列口(RS232)。所以電腦自檢首先自檢cpu,到串列口(RS232)檢查結束。
自檢中如發現有錯誤,將按兩種情況處理:對於嚴重故障(致命性故障)則停機,此時由於各種初始化操作還沒完成,不能給出任何提示或信號;對於非嚴重故障則給出提示或聲音報警信號,等待用戶處理。
當自檢完成後,系統進行下一步驟:從硬碟、光碟或網路伺服器上尋找操作系統進行啟動,電腦的控制權將由操作系統完成。
(1)電腦網路位元組順序圖擴展閱讀
開機自檢音所代表的含義:
1短:系統正常啟動。恭喜,你的機器沒有任何問題。
2短:常規錯誤,請進入CMOS Setup,重新設置不正確的選項。
1長1短:內存或主板出錯。換一條內存試試,若還是不行,只好更換 主板。
1長2短:顯示器或顯示卡錯誤。
1長3短:鍵盤控制器錯誤。檢查主板。
2短1短1短 前64K基本內存錯誤。
3短1短1短 DMA寄存器錯誤。
3短1短2短 主DMA寄存器錯誤。
4短3短4短 時鍾錯誤。
4短4短1短 串列口錯誤。
4短4短2短 並行口錯誤。
⑵ 求計算機的基本知識跟基礎大全
程序員不能任意命名,而是有規則的,因為如果遇到系統變數等,自己亂定義會沖突的。
⑶ 什麼是數據包序例號
「包」(Packet)是TCP/IP協議通信傳輸中的數據單位,一般也稱「數據包」。有人說,區域網中傳輸的不是「幀」(Frame)嗎?沒錯,但是TCP/IP協議是工作在OSI模型第三層(網路層)、第四層(傳輸層)上的,而幀是工作在第二層(數據鏈路層)。上一層的內容由下一層的內容來傳輸,所以在區域網中,「包」是包含在「幀」里的。 名詞解釋:OSI(Open System Interconnection,開放系統互聯)模型是由國際標准化組織(ISO)定義的標准,它定義了一種分層體系結構,在其中的每一層定義了針對不同通信級別的協議。OSI模型有7層,1�7層分別是:物理層、數據鏈路層、網路層、傳輸層、會話層、表示層、應用層。OSI模型在邏輯上可分為兩個部分:低層的1�4層關注的是原始數據的傳輸;高層的5�7層關注的是網路下的應用程序。 我們可以用一個形象一些的例子對數據包的概念加以說明:我們在郵局郵寄產品時,雖然產品本身帶有自己的包裝盒,但是在郵寄的時候只用產品原包裝盒來包裝顯然是不行的。必須把內裝產品的包裝盒放到一個郵局指定的專用紙箱里,這樣才能夠郵寄。這里,產品包裝盒相當於數據包,裡面放著的產品相當於可用的數據,而專用紙箱就相當於幀,且一個幀中只有一個數據包。 「包」聽起來非常抽象,那麼是不是不可見的呢?通過一定技術手段,是可以感知到數據包的存在的。比如在Windows 2000 Server中,把滑鼠移動到任務欄右下角的網卡圖標上(網卡需要接好雙絞線、連入網路),就可以看到「發送:××包,收到:××包」的提示。通過數據包捕獲軟體,也可以將數據包捕獲並加以分析。 就是用數據包捕獲軟體Iris捕獲到的數據包的界面圖,在此,大家可以很清楚地看到捕獲到的數據包的MAC地址、IP地址、協議類型埠號等細節。通過分析這些數據,網管員就可以知道網路中到底有什麼樣的數據包在活動了。 附: 數據包的結構 數據包的結構非常復雜,不是三言兩語能夠說清的,在這里主要了解一下它的關鍵構成就可以了,這對於理解TCP/IP協議的通信原理是非常重要的。數據包主要由「目的IP地址」、「源IP地址」、「凈載數據」等部分構成。 數據包的結構與我們平常寫信非常類似,目的IP地址是說明這個數據包是要發給誰的,相當於收信人地址;源IP地址是說明這個數據包是發自哪裡的,相當於發信人地址;而凈載數據相當於信件的內容。 正是因為數據包具有這樣的結構,安裝了TCP/IP協議的計算機之間才能相互通信。我們在使用基於TCP/IP協議的網路時,網路中其實傳遞的就是數據包。理解數據包,對於網路管理的網路安全具有至關重要的意義。
參考資料:http://ke..com/view/25880.htm
⑷ 計算機網路原理問題 請解答第二問
2017年12月07日星期四,
問題:
請注意看上圖,1分組中的第二行(tcp報頭)中第二個4位元組的值就是Sequence number(順序號碼),它明確的告訴目標主機(d3444750)需要接收Sequence number(順序號碼)為846b741c5的數據包,然後2分組中的源主機(d3444750)對Sequence number(順序號碼)846b741c5的數據包進行確認,並按照tcp規則將Sequence number(順序號碼)加一後寫入第二行的第三個4位元組中即Acknowledge number(確認號碼),同時,向自己的目標主機(c0a80008)發送Sequence number(順序號碼)為(e0599fef)的數據包,最後,3分組中的第二行中的第三個4位元組對剛才從主機(d3444750)接收的(e0599fef)的數據包進行了確認【也是Acknowledge number(確認號碼)+1】,又因為接到了主機(d3444750)對846b741c5的數據包的確認,因此將同時發送Sequence number(順序號碼)為846b741c6的數據包給目標主機(d3444750)。
參考書內容:TCP(Transmission Control Protocol)傳輸控制協議
TCP是主機對主機層的傳輸控制協議,提供可靠的連接服務,採用三次握手確認建立一個連接:
位碼即tcp標志位,有6種標示:SYN(synchronous建立聯機) ACK(acknowledgement 確認) PSH(push傳送) FIN(finish結束) RST(reset重置) URG(urgent緊急)Sequence number(順序號碼) Acknowledge number(確認號碼)
第一次握手:主機A發送位碼為syn=1,隨機產生seq number=1234567的數據包到主機B,主機B由SYN=1知道,A要求建立聯機;
第二次握手:主機B收到請求後,要確認聯機信息,向A發送ack number=1234568(主機A的seq number+1),syn=1,ack=1,隨機產生seq number=7654321的包;
第三次握手:主機A收到後檢查ack number是否正確,即第一次發送的seq number+1,以及ack(對A的發送來的請求,B的確認,)是否為1,若正確,主機A會再發送ack number=7654322(主機B的seq number+1),ack=1,主機B收到後確認seq number值(7654322)並且ack=1則連接建立成功。
擴展閱讀材料:
TCP傳輸連接中的SYN、ACK、SEQ、AN分別是什麼意思?他們所帶的數字又是代表什麼?
SYn=1.ACK=0,SEQ=200
SYN=1,ACK=1.SEQ=4800,AN=201
SYN=1,ACK=1.SEQ=201,AN=4801
SYN,ACK是標志位
SEQ,AN是數據包序號
SYN=1, ACK=0, SEQ=200 的意思是:發送端發出一個SYN請求(SYn=1),同時發送端發送了一個序號為SEQ=200的數據包,
SYN=1, ACK=1, SEQ=4800, AN=201 的意思是:接收端的確認信息,收到了序號為SEQ=200的數據包,同時接收端也發送了一個初始數據包序號為SEQ=4800的數據包,並等待發送端確認,
SYN=1,ACK=1.SEQ=201,AN=4801的意思是:首先,發送端通過接收端送回的AN=201,知道接收端已成功的接收了序號為SEQ=200的數據包,接下來發送端要發送序號為SEQ=201的數據包,並且同時告知接收端剛才送來的序號為SEQ=4800的包已收到,
⑸ 什麼是位元組序
小頭 (LSB):
Least Significant Bit (or Byte)
大頭 (MSB):
Most Significant Bit (or Byte)
位元組序,即位元組在電腦中存放時的序列與輸入(輸出)時的序列是先到的在前還是後到的在前。
輸入(輸出)流位元組序:
B1,B2,B3,B4,B5,B6.....
電腦中
short int a,b,c;
可能是:
a = B2 << 8 + B1;
b = B4 << 8 + B3;
c = B6 << 8 + B5;
也可能是:
a = B1 << 8 + B2;
b = B3 << 8 + B3;
c = B5 << 8 + B6;
這取決於位元組序的約定。例如GIF圖像文件中的許多定義塊中的short int 是 a = B2 << 8 + B1; ...
即B2左移8位加B1等於一個十六位的整數。
⑹ 位元組序的位元組數據
1.BIG-ENDIAN、LITTLE-ENDIAN跟多位元組類型的數據有關的比如int,short,long型,而對單位元組數據byte卻沒有影響。
比如 int a = 0x08070605
在BIG-ENDIAN的情況下存放為:
位元組號 0 1 2 3
數據 08 07 06 05
在LITTLE-ENDIAN的情況下存放為:
位元組號 0 1 2 3
數據 05 06 07 08
又比如數字0x87654321,在兩種不同位元組序CPU中,其存儲順序如下所示:
Little Endian
低地址 高地址
----------------------------------------->
| 21 |43 | 65 | 87 |
Big Endian
低地址 高地址
----------------------------------------->
| 87 |65 | 43 |21 |
從上面兩圖可以看出:
採用LITTLE-ENDIAN方式存儲數據,地位地址存放低位數據,可以用「低對低」來方便記憶與理解。
採用BIG-ENDIAN方式存儲數據,從書寫習慣上看,高位數據排列在前面(低址在前面),可以用「高位在前」來簡化理解。
2.BIG-ENDIAN、LITTLE-ENDIAN、跟CPU有關的,每一種CPU不是BIG-ENDIAN就是LITTLE-ENDIAN、。IA架構(Intel、AMD)的CPU中是Little-Endian,而PowerPC 、SPARC和Motorola處理器是Big-Endian。這其實就是所謂的主機位元組序。而網路位元組序是指數據在網路上傳輸時是大頭還是小頭的,在Internet的網路位元組序是BIG-ENDIAN。所謂的JAVA位元組序指的是在JAVA虛擬機中多位元組類型數據的存放順序,JAVA位元組序也是BIG-ENDIAN。
3.所以在用C/C++寫通信程序時,在發送數據前務必用htonl和htons去把整型和短整型的數據進行從主機位元組序到網路位元組序的轉換,而接收數據後對於整型和短整型數據則必須調用ntohl和ntohs實現從網路位元組序到主機位元組序的轉換,在Visual C++中,這四個函數被包含在頭文件Winsock2.h裡面,鏈接時需要鏈入Ws2_32.lib。如果通信的一方是JAVA程序、一方是C/C++程序時,則需要在C/C++一側使用以上幾個方法進行位元組序的轉換,而JAVA一側,則不需要做任何處理,因為JAVA位元組序與網路位元組序都是BIG-ENDIAN,只要C/C++一側能正確進行轉換即可(發送前從主機序到網路序,接收時反變換)。如果通信的雙方都是JAVA,則根本不用考慮位元組序的問題了。
4.如果網路上全部是相同位元組序的計算機那麼不會出現任何問題,但由於實際有大量不同位元組序的計算機,所以如果不對數據進行轉換,就會出現大量的錯誤。
5.文章開頭所提出的問題,就是因為程序運行在X86架構的PC SERVER上,發送數據的一端用C實現的,接收一端是用JAVA實現的,而發送端在發送數據前未進行從主機位元組序到網路位元組序的轉換,這樣接收端接收到的是LITTLE-ENDIAN的數據,數據解釋自然出錯。
具體數據如下,實際發送的數據為23578
發送端發送數據: 1A 5C
接收端接收到數據後,按BIG-ENDIAN進行解釋得到的則是6748,顯然不是正確的數據。
⑺ 位元組、KB、MB、GB 之間的換算關系
數據存儲以10進製表示:
1B(byte,位元組)= 8 bit(見下文);
1KB(Kilobyte,千位元組)=1000B= 10^3 B;
1MB(Megabyte,兆位元組,百萬位元組,簡稱「兆」)=1000KB= 10^6 B;
1GB(Gigabyte,吉位元組,十億位元組,又稱「千兆」)=1000MB= 10^9 B。
數據傳輸以2進製表示:
1B(byte,位元組)= 8 bit(見下文);
1KiB(Kibibyte,千位元組)=1024B= 2^10 B;
1MiB(Mebibyte,兆位元組,百萬位元組,簡稱「兆」)=1024KB= 2^20 B;
1GiB(Gibibyte,吉位元組,十億位元組,又稱「千兆」)=1024MB= 2^30 B。
(7)電腦網路位元組順序圖擴展閱讀:
位元組相關單位:
B與bit
數據存儲是以「位元組」(Byte)為單位,數據傳輸大多是以「位」(bit,又名「比特」)為單位,一個位就代表一個0或1(即二進制),每8個位(bit,簡寫為b)組成一個位元組(Byte,簡寫為B),是最小一級的信息單位。
B與iB
1KiB(Kibibyte)=1024byte
1KB(Kilobyte)=1000byte
1MiB(Mebibyte)=1048576byte
1MB(Megabyte)=1000000byte
硬碟生產商是以GB(十進制,即10的3次方=1000,如1MB=1000KB)計算的,而電腦(操作系統)是以GiB(2進制,即2的10次方, 如1MiB=1024KiB)計算的,但是國內用戶一般理解為1MiB=1M=1024 KB, 所以為了便於中文化的理解,翻譯MiB為MB也是可以的。
⑻ 網路位元組順序和機器順序什麼區別
存在兩種位元組順序:NBO與HBO
網路位元組順序NBO(Network Byte Order):
按從高到低的順序存儲,在網路上使用統一的網路位元組順序,可以避免兼容性問題。
主機位元組順序(HBO,Host Byte Order):
不同的機器HBO不相同,與CPU設計有關
計算機數據存儲有兩種位元組優先順序:高位位元組優先和低位位元組優先。Internet上數據以高位位元組優先順序在網路上傳輸,所以對於在內部是以低位位元組優先方式存儲數據的機器,在Internet上傳輸數據時就需要進行轉換。
我們要討論的第一個結構類型是:struct sockaddr,該類型是用來保存socket信息的:
struct sockaddr {
unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14]; /* 14 位元組的協議地址 */ };
sa_family一般為AF_INET;sa_data則包含該socket的IP地址和埠號。
另外還有一種結構類型:
struct sockaddr_in {
short int sin_family; /* 地址族 */
unsigned short int sin_port; /* 埠號 */
struct in_addr sin_addr; /* IP地址 */
unsigned char sin_zero[8]; /* 填充0 以保持與struct sockaddr同樣大小 */
};
這個結構使用更為方便。sin_zero(它用來將sockaddr_in結構填充到與struct sockaddr同樣的長度)應該用bzero()或memset()函數將其置為零。指向sockaddr_in 的指針和指向sockaddr的指針可以相互轉換,這意味著如果一個函數所需參數類型是sockaddr時,你可以在函數調用的時候將一個指向 sockaddr_in的指針轉換為指向sockaddr的指針;或者相反。sin_family通常被賦AF_INET;sin_port和 sin_addr應該轉換成為網路位元組優先順序;而sin_addr則不需要轉換。
我們下面討論幾個位元組順序轉換函數:
htons()--"Host to Network Short" ; htonl()--"Host to Network Long"
ntohs()--"Network to Host Short" ; ntohl()--"Network to Host Long"
在這里, h表示"host" ,n表示"network",s 表示"short",l表示 "long"。
打開socket 描述符、建立綁定並建立連接
socket函數原型為:
int socket(int domain, int type, int protocol);
domain參數指定socket的類型:SOCK_STREAM 或SOCK_DGRAM;protocol通常賦值「0」。Socket()調用返回一個整型socket描述符,你可以在後面的調用使用它。
一旦通過socket調用返回一個socket描述符,你應該將該socket與你本機上的一個埠相關聯(往往當你在設計伺服器端程序時需要調用該函數。隨後你就可以在該埠監聽服務請求;而客戶端一般無須調用該函數)。 Bind函數原型為:
int bind(int sockfd,struct sockaddr *my_addr, int addrlen);
Sockfd是一個socket描述符,my_addr是一個指向包含有本機IP地址及埠號等信息的sockaddr類型的指針;addrlen常被設置為sizeof(struct sockaddr)。
最後,對於bind 函數要說明的一點是,你可以用下面的賦值實現自動獲得本機IP地址和隨機獲取一個沒有被佔用的埠號:
my_addr.sin_port = 0; /* 系統隨機選擇一個未被使用的埠號 */
my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本機IP地址 */
通過將my_addr.sin_port置為0,函數會自動為你選擇一個未佔用的埠來使用。同樣,通過將 my_addr.sin_addr.s_addr置為INADDR_ANY,系統會自動填入本機IP地址。Bind()函數在成功被調用時返回0;遇到錯誤時返回「-1」並將errno置為相應的錯誤號。另外要注意的是,當調用函數時,一般不要將埠號置為小於1024的值,因為1~1024是保留埠號,你可以使用大於1024中任何一個沒有被佔用的埠號。
Connect()函數用來與遠端伺服器建立一個TCP連接,其函數原型為:
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
Sockfd是目的伺服器的sockt描述符;serv_addr是包含目的機IP地址和埠號的指針。遇到錯誤時返回-1,並且errno中包含相應的錯誤碼。進行客戶端程序設計無須調用bind(),因為這種情況下只需知道目的機器的IP地址,而客戶通過哪個埠與伺服器建立連接並不需要關心,內核會自動選擇一個未被佔用的埠供客戶端來使用。
Listen()——監聽是否有服務請求
在伺服器端程序中,當socket與某一埠捆綁以後,就需要監聽該埠,以便對到達的服務請求加以處理。
int listen(int sockfd, int backlog);
Sockfd是Socket系統調用返回的socket 描述符;backlog指定在請求隊列中允許的最大請求數,進入的連接請求將在隊列中等待accept()它們(參考下文)。Backlog對隊列中等待服務的請求的數目進行了限制,大多數系統預設值為20。當listen遇到錯誤時返回-1,errno被置為相應的錯誤碼。
故伺服器端程序通常按下列順序進行函數調用:
socket(); bind(); listen(); /* accept() goes here */
accept()——連接埠的服務請求。
當某個客戶端試圖與伺服器監聽的埠連接時,該連接請求將排隊等待伺服器accept()它。通過調用accept()函數為其建立一個連接,accept()函數將返回一個新的socket描述符,來供這個新連接來使用。而伺服器可以繼續在以前的那個 socket上監聽,同時可以在新的socket描述符上進行數據send()(發送)和recv()(接收)操作:
int accept(int sockfd, void *addr, int *addrlen);
sockfd是被監聽的socket描述符,addr通常是一個指向sockaddr_in變數的指針,該變數用來存放提出連接請求服務的主機的信息(某台主機從某個埠發出該請求);addrten通常為一個指向值為sizeof(struct sockaddr_in)的整型指針變數。錯誤發生時返回一個-1並且設置相應的errno值。
Send()和recv()——數據傳輸
這兩個函數是用於面向連接的socket上進行數據傳輸。
Send()函數原型為:
int send(int sockfd, const void *msg, int len, int flags);
Sockfd是你想用來傳輸數據的socket描述符,msg是一個指向要發送數據的指針。
Len是以位元組為單位的數據的長度。flags一般情況下置為0(關於該參數的用法可參照man手冊)。
char *msg = "Beej was here!"; int len, bytes_sent; ... ...
len = strlen(msg); bytes_sent = send(sockfd, msg,len,0); ... ...
Send()函數返回實際上發送出的位元組數,可能會少於你希望發送的數據。所以需要對send()的返回值進行測量。當send()返回值與len不匹配時,應該對這種情況進行處理。
recv()函數原型為:
int recv(int sockfd,void *buf,int len,unsigned int flags);
Sockfd是接受數據的socket描述符;buf 是存放接收數據的緩沖區;len是緩沖的長度。Flags也被置為0。Recv()返回實際上接收的位元組數,或當出現錯誤時,返回-1並置相應的errno值。
Sendto()和recvfrom()——利用數據報方式進行數據傳輸
在無連接的數據報socket方式下,由於本地socket並沒有與遠端機器建立連接,所以在發送數據時應指明目的地址,sendto()函數原型為:
int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);
該函數比send()函數多了兩個參數,to表示目地機的IP地址和埠號信息,而tolen常常被賦值為sizeof (struct sockaddr)。Sendto 函數也返回實際發送的數據位元組長度或在出現發送錯誤時返回-1。
Recvfrom()函數原型為:
int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);
from是一個struct sockaddr類型的變數,該變數保存源機的IP地址及埠號。fromlen常置為sizeof (struct sockaddr)。當recvfrom()返回時,fromlen包含實際存入from中的數據位元組數。Recvfrom()函數返回接收到的位元組數或當出現錯誤時返回-1,並置相應的errno。
應注意的一點是,當你對於數據報socket調用了connect()函數時,你也可以利用send()和recv()進行數據傳輸,但該socket仍然是數據報socket,並且利用傳輸層的UDP服務。但在發送或接收數據報時,內核會自動為之加上目地和源地址信息。
Close()和shutdown()——結束數據傳輸
當所有的數據操作結束以後,你可以調用close()函數來釋放該socket,從而停止在該socket上的任何數據操作:close(sockfd);
你也可以調用shutdown()函數來關閉該socket。該函數允許你只停止在某個方向上的數據傳輸,而一個方向上的數據傳輸繼續進行。如你可以關閉某socket的寫操作而允許繼續在該socket上接受數據,直至讀入所有數據。
int shutdown(int sockfd,int how);
Sockfd的含義是顯而易見的,而參數 how可以設為下列值:
·0-------不允許繼續接收數據
·1-------不允許繼續發送數據
·2-------不允許繼續發送和接收數據,均為允許則調用close ()
shutdown在操作成功時返回0,在出現錯誤時返回-1(並置相應errno)。
DNS——域名服務相關函數
由於IP地址難以記憶和讀寫,所以為了讀寫記憶方便,人們常常用域名來表示主機,這就需要進行域名和IP地址的轉換。函數gethostbyname()就是完成這種轉換的,函數原型為:
struct hostent *gethostbyname(const char *name);
函數返回一種名為hosten的結構類型,它的定義如下:
struct hostent {
char *h_name; /* 主機的官方域名 */
char **h_aliases; /* 一個以NULL結尾的主機別名數組 */
int h_addrtype; /* 返回的地址類型,在Internet環境下為AF-INET */
int h_length; /*地址的位元組長度 */
char **h_addr_list; /* 一個以0結尾的數組,包含該主機的所有地址*/
};
#define h_addr h_addr_list[0] /*在h-addr-list中的第一個地址*/
2、將主機的unsigned long值轉換為網路位元組順序(32位):為什麼要這樣做呢?因為不同的計算機使用不同的位元組順序存儲數據。因此任何從Winsock函數對IP地址和埠號的引用和傳給Winsock函數的IP地址和埠號均時按照網路順序組織的。
&<60;&<60;&<60;&<60;&<60; u_long&<60; htonl(u_long hostlong);
&<60;&<60;&<60;&<60;&<60; 舉例:htonl(0)=0
&<60;&<60;&<60;&<60;&<60; htonl(80)= 1342177280
3、將unsigned long數從網路位元組順序轉換位主機位元組順序,是上面函數的逆函數。&<60;&<60;&<60;&<60;&<60;&<60; u_long&<60; ntohl(u_long netlong);
&<60;&<60;&<60;&<60;&<60; 舉例:ntohl(0)=0
&<60;&<60;&<60;&<60;&<60; ntohl(1342177280)= 80
1342177280 = 80*256*256*256
4、將主機的unsigned short值轉換為網路位元組順序(16位):原因同2:&<60;&<60;&<60;&<60;&<60;&<60; u_short&<60; htons(u_short hostshort);
&<60;&<60;&<60;&<60;&<60; 舉例:htonl(0)=0
&<60;&<60;&<60;&<60;&<60; htonl(80)= 20480
5、將unsigned short數從網路位元組順序轉換位主機位元組順序,是上面函數的逆函數。&<60;&<60;&<60;&<60;&<60;&<60; u_short&<60; ntohs(u_short netshort);
&<60;&<60;&<60;&<60;&<60; 舉例:ntohs(0)=0
&<60;&<60;&<60;&<60;&<60; ntohsl(20480)= 80
20480 = 8-*256 (大小端地址轉換)
****
不同的CPU有不同的位元組序類型 這些位元組序是指整數在內存中保存的順序 這個叫做主機序
最常見的有兩種
1. Little endian:將低序位元組存儲在起始地址
2. Big endian:將高序位元組存儲在起始地址
LE little-endian
最符合人的思維的位元組序
地址低位存儲值的低位
地址高位存儲值的高位
怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說
低位值小,就應該放在內存地址小的地方,也即內存地址低位
反之,高位值就應該放在內存地址大的地方,也即內存地址高位
BE big-endian
最直觀的位元組序
地址低位存儲值的高位
地址高位存儲值的低位
為什麼說直觀,不要考慮對應關系
只需要把內存地址從左到右按照由低到高的順序寫出
把值按照通常的高位到低位的順序寫出
兩者對照,一個位元組一個位元組的填充進去
⑼ 用photoshop儲存tif圖片格式裡面的,圖像壓縮,像素順序,位元組順序,圖層壓縮他們都是什麼意思
另存的時候,把所有圖層都合並了。然後在保存。
⑽ 計算機硬體為什麼要區分位元組序
一、位元組序定義
位元組序,顧名思義位元組的順序,再多說兩句就是大於一個位元組類型的數據在內存中的存放順序(一個位元組的數據當然就無需談順序的問題了)。
其實大部分人在實際的開發中都很少會直接和位元組序打交道。唯有在跨平台以及網路程序中位元組序才是一個應該被考慮的問題。
在所有的介紹位元組序的文章中都會提到位元組序分為兩類:Big-Endian和Little-Endian。引用標準的Big-Endian和Little-Endian的定義如下:
a) Little-Endian就是低位位元組排放在內存的低地址端,高位位元組排放在內存的高地址端。
b) Big-Endian就是高位位元組排放在內存的低地址端,低位位元組排放在內存的高地址端。
c) 網路位元組序:4個位元組的32 bit值以下面的次序傳輸:首先是0~7bit,其次8~15bit,然後16~23bit,最後是24~31bit。這種傳輸次序稱作大端位元組序。由於TCP/IP首部中所有的二進制整數在網路中傳輸時都要求以這種次序,因此它又稱作網路位元組序。比如,乙太網頭部中2位元組的「乙太網幀類型」,表示後面數據的類型。對於ARP請求或應答的乙太網幀類型來說,在網路傳輸時,發送的順序是0x08,0x06。在內存中的映象如下圖所示:
棧底 (高地址)
---------------
0x06 -- 低位
0x08 -- 高位
---------------
棧頂 (低地址)
該欄位的值為0x0806。按照大端方式存放在內存中。
二、高/低地址與高低位元組
首先我們要知道我們C程序映像中內存的空間布局情況:在《C專家編程》中或者《Unix環境高級編程》中有關於內存空間布局情況的說明,大致如下圖:
----------------------- 最高內存地址 0xffffffff
| 棧底
.
. 棧
.
棧頂
-----------------------
|
|
|/
NULL (空洞)
/|
|
|
-----------------------
堆
-----------------------
未初始化的數據
----------------(統稱數據段)
初始化的數據
-----------------------
正文段(代碼段)
----------------------- 最低內存地址 0x00000000
以上圖為例如果我們在棧上分配一個unsigned char buf[4],那麼這個數組變數在棧上是如何布局的呢[注1]?看下圖:
棧底 (高地址)
----------
buf[3]
buf[2]
buf[1]
buf[0]
----------
棧頂 (低地址)
現在我們弄清了高低地址,接著來弄清高/低位元組,如果我們有一個32位無符號整型0x12345678(呵呵,恰好是把上面的那4個位元組buf看成一個整型),那麼高位是什麼,低位又是什麼呢?其實很簡單。在十進制中我們都說靠左邊的是高位,靠右邊的是低位,在其他進制也是如此。就拿0x12345678來說,從高位到低位的位元組依次是0x12、0x34、0x56和0x78。
高低地址和高低位元組都弄清了。我們再來回顧一下Big-Endian和Little-Endian的定義,並用圖示說明兩種位元組序:
以unsigned int value = 0x12345678為例,分別看看在兩種位元組序下其存儲情況,我們可以用unsigned char buf[4]來表示value:
Big-Endian: 低地址存放高位,如下圖:
棧底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
棧頂 (低地址)
Little-Endian: 低地址存放低位,如下圖:
棧底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
---------------
棧頂 (低地址)
在現有的平台上Intel的X86採用的是Little-Endian,而像Sun的SPARC採用的就是Big-Endian。