網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
字節(jié)序
? ? ? ? 最近在看 redis 的內(nèi)存編碼,里面涉及到字節(jié)序相關(guān)的內(nèi)容。這里就當(dāng)復(fù)習(xí)一下,做個(gè)簡(jiǎn)單的回顧。
? ? ? ? 數(shù)據(jù)存儲(chǔ)在內(nèi)存中,是以字節(jié)為單位的,如果是單字節(jié)數(shù)據(jù)(如char、unsigned char、int8)就不會(huì)有字節(jié)序的問(wèn)題。但是多字節(jié)數(shù)據(jù)(如 int、float、double)就要考慮字節(jié)序的問(wèn)題了。字節(jié)序共分為兩種:大端序 和 小端序。
大端序
? ? ? ? 數(shù)據(jù)的高位字節(jié)存儲(chǔ)在地址的低端;低位字節(jié)存儲(chǔ)在地址的高端。如圖所示,值為 0x12345678 的四字節(jié)整數(shù)在大端序的主機(jī)上的內(nèi)存排布。
小端序
? ? ? ? 數(shù)據(jù)的高位字節(jié)存儲(chǔ)在地址的高端;低位字節(jié)存儲(chǔ)在地址的低端。如圖所示,值為 0x12345678 的四字節(jié)整數(shù)在小端序的主機(jī)上的內(nèi)存排布。
主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序
? ? ? ? ?除了主機(jī)字節(jié)序,還有網(wǎng)絡(luò)字節(jié)序。主機(jī)字節(jié)序由CPU決定,Intel Core 經(jīng)測(cè)試都是小端字節(jié)序。而網(wǎng)絡(luò)字節(jié)序采用的是大端序。測(cè)試字節(jié)序可以通過(guò)一段 C 的源碼搞定。
#include <stdio.h> int main(int argc, char *argv[]) { int i; int x = 0x12345678; for (i = 0; i < sizeof(int); ++i) { unsigned char *p = ((unsigned char *)(&x)) + i; unsigned char v = *p; printf("%p 0x%d%d\n", p, v>>4, v & 0xf ); } return 0; }
? ? ? ? ?取得整數(shù) x 的首地址轉(zhuǎn)換成 unsigned char* 指針后再向前偏移 i 個(gè)單位,分別得到這 sizeof(int) 個(gè)字節(jié)的地址,然后用 * 取得每個(gè)地址上的值,通過(guò)位運(yùn)算轉(zhuǎn)換成 16進(jìn)制 輸出。
? ? ? ? ?Linux 系統(tǒng)可以通過(guò)指令獲取 CPU 的類(lèi)型:
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 4 Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz
大端序和小端序的互轉(zhuǎn)
? ? ? ? 大端序和小端序的互相轉(zhuǎn)換,其實(shí)就是內(nèi)存翻轉(zhuǎn),在知道一個(gè)整數(shù)或者一個(gè)指針的字節(jié)數(shù)的時(shí)候,就是做一個(gè)鏡像的交換。這里以 64位 整型為例:
void memrev64(void *p) { unsigned char *x = p, t; t = x[0]; x[0] = x[7]; x[7] = t; t = x[1]; x[1] = x[6]; x[6] = t; t = x[2]; x[2] = x[5]; x[5] = t; t = x[3]; x[3] = x[4]; x[4] = t; } uint64_t intrev64(uint64_t v) { memrev64(&v); return v; }
? ? ? ? 64位整數(shù)的字節(jié)數(shù)為8,所以在字節(jié)序進(jìn)行轉(zhuǎn)換的時(shí)候:
? ? ? ??第0個(gè)字節(jié)和第7個(gè)字節(jié)交換;
? ? ? ??第1個(gè)字節(jié)和第6個(gè)字節(jié)交換;
? ? ? ??第2個(gè)字節(jié)和第5個(gè)字節(jié)交換;
? ? ? ? 第3個(gè)字節(jié)和第4個(gè)字節(jié)交換;
? ? ? ? 對(duì)于 32位整數(shù)、16位整數(shù)的情況,就更加簡(jiǎn)單了,不再累述。
原文鏈接:https://blog.csdn.net/WhereIsHeroFrom/article/details/84643017
相關(guān)推薦
- 2022-06-25 C++鏈表類(lèi)的封裝詳情介紹_C 語(yǔ)言
- 2023-01-19 pip如何用pipdeptree查看包依賴_python
- 2022-11-21 Android性能優(yōu)化之JVMTI與內(nèi)存分配_Android
- 2022-06-06 SpringBoot、SpringCloud、SpringCloudAlibaba的版本對(duì)應(yīng)關(guān)系
- 2022-03-18 docker?創(chuàng)建容器時(shí)指定容器ip的實(shí)現(xiàn)示例_docker
- 2022-10-16 QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn)詳解_C 語(yǔ)言
- 2022-11-07 Go語(yǔ)言深度拷貝工具deepcopy的使用教程_Golang
- 2022-04-16 python?import模塊時(shí)有錯(cuò)誤紅線的原因_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支