直接將字符變量賦值給整型變量,即可實現(xiàn)字符到對應(yīng)ASCII碼的轉(zhuǎn)換。
成都創(chuàng)新互聯(lián)公司是一家成都網(wǎng)站建設(shè)、網(wǎng)站制作,提供網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,網(wǎng)站制作,建網(wǎng)站,按需定制網(wǎng)站,網(wǎng)站開發(fā)公司,于2013年創(chuàng)立是互聯(lián)行業(yè)建設(shè)者,服務(wù)者。以提升客戶品牌價值為核心業(yè)務(wù),全程參與項目的網(wǎng)站策劃設(shè)計制作,前端開發(fā),后臺程序制作以及后期項目運營并提出專業(yè)建議和思路。
具體實現(xiàn)方法可以參考如下程序段:
char str[]="abds%*34dfs"; // 定義一個字符數(shù)組,存放待轉(zhuǎn)換為ASCII碼的字符串
int AsciiNum[20]; // 定義一個整型數(shù)組,存放字符所對應(yīng)的ASCII碼值,數(shù)組大小根據(jù)字符串長度進(jìn)行設(shè)置
int i;
// 將字符串的每個字符逐個賦值給整型數(shù)組AsciiNum,即實現(xiàn)字符到ASCII碼值的轉(zhuǎn)換
for(i=0; istrlen(str); i++)
{
AsciiNum[i] = str[i]; // 最后數(shù)組AsciiNum就是字符串每個字符所對應(yīng)ASCII碼值的數(shù)組
}
當(dāng)分別處于大小端模式下的內(nèi)容存放如下
(1)大端模式存儲(存儲地址為16位)
地址 數(shù)據(jù)
0x0004(高地址) 0x44
0x0003 0x33
0x0002 0x22
0x0001(低地址) 0x11
(2)小端模式存儲(存儲地址為16位)
地址 數(shù)據(jù)
0x0004(高地址) 0x11
0x0003 0x22
0x0002 0x33
0x0001(低地址) 0x44
在前面也簡單闡述了大小端序的定義并結(jié)合簡單實例來說明,接下來會給出詳細(xì)實例來說明:
1、大端序(Big-Endian):或稱大尾序
一個類型: int32 的數(shù) 0X0A0B0C0D的內(nèi)存存放情況
數(shù)據(jù)是以8bits為單位
2、小端序(little-endian):或稱小尾序
比如0x00000001
大端序:內(nèi)存低比特位 00000000 00000000 00000000 00000001 內(nèi)存高比特位
小端序:內(nèi)存低比特位 10000000 00000000 00000000 00000000 內(nèi)存高比特位
其實在前面羅列出那么東西,最終是為了接下來講述的在golang中涉及到網(wǎng)絡(luò)傳輸、文件存儲時的選擇。一般來說網(wǎng)絡(luò)傳輸?shù)淖止?jié)序,可能是大端序或者小端序,取決于軟件開始時通訊雙方的協(xié)議規(guī)定。TCP/IP協(xié)議RFC1700規(guī)定使用“大端”字節(jié)序為網(wǎng)絡(luò)字節(jié)序,開發(fā)的時候需要遵守這一規(guī)則。默認(rèn)golang是使用大端序。詳情見golang中包encoding/binary已提供了大、小端序的使用
輸出結(jié)果:
16909060 use big endian:
int32 to bytes: [1 2 3 4] ### [0001 0002 0003 0004]
bytes to int32: 16909060
16909060 use little endian:
int32 to bytes: [4 3 2 1] ### [0004 0003 0002 0001]
bytes to int32: 16909060
在RPCX框架中關(guān)于RPC調(diào)用過程涉及的傳遞消息進(jìn)行編碼的,采用的就是大端序模式
golang語言本身就是c的工具集,開發(fā)c的程序用到的大部分結(jié)構(gòu)體,內(nèi)存管理,攜程等,golang基本都有,他只是在這個基礎(chǔ)上又加了一些概念這里說一個很小的問題,就是字節(jié)數(shù)組轉(zhuǎn)string的問題,網(wǎng)上大部分都是這樣轉(zhuǎn)的(包括google上):string(p[:]),這個轉(zhuǎn)完了是有問題的,我們再來看一下string這個結(jié)構(gòu)體:
struct String
{
byte* str;
intgo len;
};
這個結(jié)構(gòu)體讓我想起了nginx的string,他是這樣定義的:
typedef struct {
size_t len;
u_char *data;
} ngx_str_t;
golang里邊 string的概念其實不是以前遇到\0結(jié)尾的概念了,他其實就是一塊連續(xù)的內(nèi)存,首地址+長度,上面那樣賦值,如果p里邊有\(zhòng)0,他不會做處理這個時候,如果再對這個string做其他處理就可能出問題了,比如strconv.Atoi轉(zhuǎn)成int就有錯誤,解決辦法就是需要自己寫一個正規(guī)的轉(zhuǎn)換函數(shù):
func byteString(p []byte) string {
for i := 0; i len(p); i++ {
if p[i] == 0 {
return string(p[0:i])
}
}
return string(p)
}
這樣就不會出問題了
Go語言標(biāo)準(zhǔn)庫中提供了sort包對整型,浮點型,字符串型切片進(jìn)行排序,檢查一個切片是否排好序,使用二分法搜索函數(shù)在一個有序切片中搜索一個元素等功能。
關(guān)于sort包內(nèi)的函數(shù)說明與使用,請查看
在這里簡單講幾個sort包中常用的函數(shù)
在Go語言中,對字符串的排序都是按照字節(jié)排序,也就是說在對字符串排序時是區(qū)分大小寫的。
二分搜索算法
Go語言中提供了一個使用二分搜索算法的sort.Search(size,fn)方法:每次只需要比較㏒?n個元素,其中n為切片中元素的總數(shù)。
sort.Search(size,fn)函數(shù)接受兩個參數(shù):所處理的切片的長度和一個將目標(biāo)元素與有序切片的元素相比較的函數(shù),該函數(shù)是一個閉包,如果該有序切片是升序排列,那么在判斷時使用 有序切片的元素 = 目標(biāo)元素。該函數(shù)返回一個int值,表示與目標(biāo)元素相同的切片元素的索引。
在切片中查找出某個與目標(biāo)字符串相同的元素索引
go語言的字符串是UTF-8編碼的、不可改變的字節(jié)序列。
要修改字符串,只能以原串為基礎(chǔ),創(chuàng)建一個新串。下面的圖中是一個參考示例,提供了以原串為藍(lán)本,創(chuàng)建新串的兩種方法。
代碼
輸出
本文題目:go語言網(wǎng)絡(luò)字節(jié)序互換,go語言重構(gòu)
分享鏈接:http://muchs.cn/article14/phigde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、網(wǎng)站建設(shè)、微信公眾號、搜索引擎優(yōu)化、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)