當前位置:首頁 » 存儲配置 » 數據大小端存儲

數據大小端存儲

發布時間: 2022-03-07 13:19:37

1. 大小端存儲方式與操作系統有關嗎

大端模式,是指數據的高位元組保存在內存的低地址中,而數據的低位元組保存在內存的高地址中。小端模式,是指數據的高位元組保存在內存的高地址中,而數據的低位元組保存在內存的低地址中。這是兩種不同的存儲方式,與系統無關。具體你可以查一查它的起源,好像與《格列佛游記》有關。

2. 什麼是隨機存儲中的大小端模式

所謂的大端模式(Big-endian),是指數據的高位元組,保存在內存的低地址中,而數據的低位元組,保存在內存的高地址中,這樣的存儲模式有點兒類似於把數據當作字元串順序處理:地址由小向大增加,而數據從高位往低位放

3. 大小端模式的簡介

所謂的大端模式(Big-endian),是指數據的高位元組,保存在內存的低地址中,而數據的低位元組,保存在內存的高地址中,這樣的存儲模式有點兒類似於把數據當作字元串順序處理:地址由小向大增加,而數據從高位往低位放;
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前32位應該這樣讀: e6 84 6c 4e ( 假設int佔4個位元組)
記憶方法: 地址的增長順序與值的增長順序相同 所謂的小端模式(Little-endian),是指數據的高位元組保存在內存的高地址中,而數據的低位元組保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前32位應該這樣讀: 4e 6c 84 e6( 假設int佔4個位元組)
記憶方法: 地址的增長順序與值的增長順序相反 對於0x11223344 儲存如下
下面這段代碼可以用來測試一下你的編譯器是大端模式還是小端模式:
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址單元
x1=((char*)&x)[1]; //高地址單元
若x0=0x11,則是大端; 若x0=0x22,則是小端......
上面的程序還可以看出,數據定址時,用的是低位位元組的地址。 #definesw16(x)((short)((((short)(x)&(short)0x00ffU)<<8)|(((short)(x)&(short)0xff00U)>>8)))

4. 保存為二進制格式的大小端問題

這個二進制文件的確有Big Endian 和Little Endian的問題,這個與CPU指令體系有關,不過不用操心,像JPEG就是Big Endian,其編解碼就都是按照這個約定來完成的,沒有平台問題,也沒有大小端的問題

5. ubuntu 是大端還是小端存儲

不同機器內部對變數的位元組存儲順序不同,有的採用大端模式(big-endian),有的採用小端模式(little-endian)。
大端模式是指高位元組數據存放在低地址處,低位元組數據放在高地址處。
小端模式是指低位元組數據存放在低地址處,高位元組數據放在高地址處。

在網路上傳輸數據時,由於數據傳輸的兩端可能對應不同的硬體平台,採用的存儲位元組順序也可能不一致,因此 TCP/IP 協議規定了在網路上必須採用網路位元組順序(也就是大端模式) 。
通過對大小端的存儲原理分析可發現,對於 char 型數據,由於其只佔一個位元組,所以不存在這個問題,這也是一般情況下把數據緩沖區定義成 char 類型 的原因之一。對於 IP 地址、埠號等非 char 型數據,必須在數據發送到網路上之前將其轉換成大端模式,在接收到數據之後再將其轉換成符合接收端主機的存儲模式。

Linux 系統為大小端模式的轉換提供了 4 個函數,輸入 man byteorder 命令可得函數原型:

<EM><STRONG><SPAN>#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);</SPAN>

</STRONG>

</EM>
htonl 表示 host to network long ,用於將主機 unsigned int 型數據轉換成網路位元組順序;
htons 表示 host to network short ,用於將主機 unsigned short 型數據轉換成網路位元組順序;
ntohl、ntohs 的功能分別與 htonl、htons 相反。

通常使用的有兩種數據類型:短型(兩個位元組)和長型(四個位元組)。
下面介紹的這些轉換函數對於這兩類的無符號整型變數都可以正確的轉換。
如果你想將一個短型數據從主機位元組順序轉換到網路位元組順序的話,有這樣一個函數htnos:
它是以"h」開頭的,代表「主機」;
緊跟著它的是"to",代表「轉換到」;
然後是"n",代表「網路」;
最後是"s",代表「短型數據」。

你可以使用"n", "h", "to", "s", "l"的任意組合。當然,你要在可能的情況下進行組合。比如,系統是沒有stolh()函數的(Short to Long Host ?)。
下面給出套接字位元組轉換程序的列表:
hotns()——"Host to NetWork Short",主機位元組順序轉換為網路位元組順序(對無符號短型進行操作 4bytes)
htonl()——"Host to NetWork Long",主機位元組順序轉換為網路位元組順序(對無符號長型進行操作 8bytes)
ntons()——"NetWork to Host short",網路位元組序轉換為主機位元組順序(對無符號短型進行操作 4bytes)
ntohl()——"NetWork to Host Long",網路位元組順序轉換為主機位元組順序(對無符號長型進行操作 8bytes)

例如:*.sin_addr.s_addr = htonl(innaddr_any)是什麼意思?
*.sin_addr.s_addr = htonl(innaddr_any)是Socket編程中用到的。
*是任意定義的一個sockaddr_in型的結構體對象sin_addr是他的一個屬性,用於定義IP地址,是strcut in_addr型的,s_addr為結構體in_addr的對象,簡單說就是三個結構體嵌套包裝的一個包。
inaddr_any一般為內核指定的,大多數系統取0,表示任意的IP地址。
htonl()簡單說是把一個本機IP轉化為網路協議中規定的格式的函數,也就是所謂的大端模式或小端模式。
htons函數是將一個u_short類型的值從主機位元組順序轉換為TCP/IP的網路位元組順序,原型聲明如下:
u_short htons(u_short hostshort);
htonl函數是將一個u_long的值從主機位元組順序轉換為TCP/IP的網路位元組順序,原型聲明如下:
u_long htonl(u_long hostlong);

位元組序和網路平台有關,不同的平台,位元組序不同。(位元組序顧名思義——位元組的排列順序)只有多於一個位元組的數據類型,才有位元組序的問題,比如short或者int類型。char是沒有這個問題的。位元組序就是在硬體裡面,一般實在內存里,如何表示存儲和表示這些數據類型。如果高位元組放到高地址上,就是大端(big endian),如果高位元組放到低地址上,就是小端模式(little endian)。

6. STC的存儲方式是大端序還是小端序

大端存儲
16位INT型數據和32位long型數據都是。數據的低位保存在內存的高地址中,數據的高位保存在內存的低地址中.

設備的大小端可以通過程序判斷的:

uin8_t 就是51單片機上的unsigned char

uint16_t 就是51單片機上的 unsigned int

51也可以通過 #include"stdint.h" 直接使用這幾種類型,C99標准新添加的頭文件。

Keil應該是支持的。

//方法一
uint8_tIs_Little_endian(void)
{
uint16_ti=1;
return(*(uint8_t*)&i);
}


//方法二
uint8_tIs_Little_endian(void)
{
union
{
uint16_tbig;
uint8_tlit;
}check;
check.big=1;
returncheck.lit;
}


//方法三
staticunion
{
uint8_ta[2];
uint16_ti;
}endian={1,0};

#defineIs_Little_endian()((uint8_t)endian.i)


//上述方法摘錄一個即可
//判斷大小端程序
intmain()
{
if(Is_Little_endian())
{
//如果進入這里,則當前設備是小端存儲
//可以在這里控制點亮一個LED,將程序編譯後放入單片機執行
//printf("It'sLittle-endian");
}
else
{
//如果進入這里,則當前設備是大端存儲
//可以在這里控制點亮另一個LED,將程序編譯後放入單片機執行
//printf("It'sBig-endian");
}
return0;
}

7. 大小端位元組序存在的意義,為什麼不用一個標

因為大小端都有很多應用,cpu很多也能在這兩種標准之間切換。

比如,常見的pc機是小端存儲,但TCP/IP協議中數據是按照大端格式存放的,兩者統一出現在pc機上,能保證運行無誤。

沒有必要做統一標準的工作,即使做了,也一定要兼容以前的兩個標准。

8. 確定一下:一個位元組內的具體存儲與大小端有關嗎

使用df -h命令來查看硬碟的掛載狀態。 關於硬碟掛載的其它說明: 一、檢測硬碟能否被識別 # fdisk -l 查找新硬碟信息,類似如下文本: Disk /dev/sdb: 36.7 GB, 36748945408 bytes 二、掛載硬碟 1、在本地硬碟中臨時創建一個目錄 #mkdir /opt/data/tmp1 2、掛載第二塊硬碟中的一個分區/dev/sdb1到tmp1 #mount /dev/sdb1 /opt/data/tmp1 3、查看是否被掛載 # df -h 查看一下是否有類似如下文本 /dev/sdb1 3.9G 1.4G 2.3G 38% /opt/tmp/tmp1 三、卸載硬碟 #umount /dev/sdb1 df命令說明 df命令用於顯示磁碟分區上的可使用的磁碟空間。默認顯示單位為KB。可以利用該命令來獲取硬碟被佔用了多少空間,目前還剩下多少空間等信息。 語法 df(選項)(參數) 選項 -a或--all:包含全部的文件系統; --block-size=<區塊大小>:以指定的區塊大小來顯示區塊數目; -h或--human-readable:以可讀性較高的方式來顯示信息; -H或--si:與-h參數相同,但在計算時是以1000 Bytes為換算單位而非1024 Bytes; -i或--inodes:顯示inode的信息; -k或--kilobytes:指定區塊大小為1024位元組; -l或--local:僅顯示本地端的文件系統; -m或--megabytes:指定區塊大小為1048576位元組; --no-sync:在取得磁碟使用信息前,不要執行sync指令,此為預設值; -P或--portability:使用POSIX的輸出格式; --sync:在取得磁碟使用信息前,先執行sync指令; -t<文件系統類型>或--type=<文件系統類型>:僅顯示指定文件系統類型的磁碟信息; -T或--print-type:顯示文件系統的類型; -x<文件系統類型>或--exclude-type=<文件系統類型>:不要顯示指定文件系統類型的磁碟信息; --help:顯示幫助; --version:顯示版本信息。 參數 文件:指定文件系統上的文件。 實例

9. 在通信中怎麼解決大小端存儲問題

按照位元組處理即可。

http://blog.163.com/asm_c/blog/static/248203113201311711560166/

參考。

10. 數據大小端讀一個位元組的數據有沒有區別

要看用什麼方式生成文件: 小端設備用fwrite(&i32_value, sizeof(i32_value), 1, fp)存儲,文件內容一樣是小端。 下次如果在本機用fread讀取則結果正確,換大端設備讀取同一個文件結果就不對了。 編寫文件系統、資料庫時經常遇到這種問題。

熱點內容
android獲取應用版本 發布:2025-02-02 05:54:19 瀏覽:744
pythonif比較 發布:2025-02-02 05:24:03 瀏覽:259
已連接的無線網如何知道密碼 發布:2025-02-02 04:53:51 瀏覽:634
android編程入門經典pdf 發布:2025-02-02 04:46:19 瀏覽:57
安卓什麼軟體測試手機電池 發布:2025-02-02 04:28:52 瀏覽:996
手機上傳快 發布:2025-02-02 04:27:46 瀏覽:308
電腦配置詳解圖解都有哪些 發布:2025-02-02 04:26:27 瀏覽:716
景區應該有什麼配置 發布:2025-02-02 04:09:08 瀏覽:120
c語言與java工作 發布:2025-02-02 03:59:57 瀏覽:283
qq買什麼不要支付密碼 發布:2025-02-02 03:50:29 瀏覽:495