真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言byte占位符 golang占位符

如何將golangbyte轉(zhuǎn)換為字符串

將golangbyte轉(zhuǎn)換為字符串:

文安網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,文安網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為文安上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的文安做網(wǎng)站的公司定做!

package main

import (

"fmt"

)

func main() {

data := [4]byte{0x31, 0x32, 0x33, 0x34}

str := string(data[:])

fmt.Println(str)

}

go的byte跟string有什么區(qū)別

byte是字節(jié)型數(shù)據(jù),string是字符串型數(shù)據(jù),它們的數(shù)據(jù)類(lèi)型不同。

一、字符串型。

字符串型的變量,字符碼范圍為0到255,可以聲明變長(zhǎng)和定長(zhǎng)字符串。

用“String*大小”的語(yǔ)法聲明一個(gè)定長(zhǎng)字符串。在Visual Basic中,文字字符串要用引號(hào)引起來(lái)。

二、字節(jié)型。

變量包含二進(jìn)制數(shù)時(shí),使用字節(jié)型。在轉(zhuǎn)換格式期間,最好用字節(jié)型變量存儲(chǔ)二進(jìn)制數(shù)。

§除了一元減法外,可以對(duì)整數(shù)進(jìn)行處理的運(yùn)算符均可處理字節(jié)型的數(shù)據(jù)類(lèi)型。因?yàn)樽止?jié)型是從0到255的無(wú)符號(hào)類(lèi)型,所以不能表示負(fù)數(shù)。

Golang bytes.buffer詳解

Buffer 介紹

Buffer 是 bytes 包中的一個(gè) type Buffer struct{…}

A buffer is a variable-sized buffer of bytes with Read and Write methods. The zero value for Buffer is an empty buffer ready to use.

(是一個(gè)變長(zhǎng)的 buffer,具有 Read 和Write 方法。 Buffer 的 零值 是一個(gè) 空的 buffer,但是可以使用)

Buffer 就像一個(gè)集裝箱容器,可以存東西,取東西(存取數(shù)據(jù))

創(chuàng)建緩沖器

輸出

寫(xiě)入到緩沖器

buffer在new的時(shí)候是空的,也是可以直接Write的

Write

結(jié)果

WriteString

結(jié)果

WriteByte

WriteRune

結(jié)果

從緩沖器中寫(xiě)出

讀出緩沖器

Read

ReadByte

返回緩沖器頭部的第一個(gè)byte

ReadRun

ReadRune方法,返回緩沖器頭部的第一個(gè)rune

為什么n==3,而n1==1呢?我們看下ReadRune 的源碼

ReadBytes

ReadBytes方法,需要一個(gè)byte作為分隔符,讀的時(shí)候從緩沖器里找出第一個(gè)出現(xiàn)的分隔符,緩沖器頭部開(kāi)始到分隔符之間的byte返回。

相當(dāng)于有一個(gè)分隔符

ReadString

和readBytes方法類(lèi)似

讀入緩沖器

ReadFrom方法,從一個(gè)實(shí)現(xiàn)io.Reader接口的r,把r的內(nèi)容讀到緩沖器里,n返回讀的數(shù)量

從緩沖器取出

Next方法,返回前n個(gè)byte(slice),原緩沖器變

緩沖區(qū)原理介紹

go字節(jié)緩沖區(qū)底層以字節(jié)切片做存儲(chǔ),切片存在長(zhǎng)度len與容量cap, 緩沖區(qū)寫(xiě)從長(zhǎng)度len的位置開(kāi)始寫(xiě),當(dāng)lencap時(shí),會(huì)自動(dòng)擴(kuò)容。緩沖區(qū)讀會(huì)從內(nèi)置標(biāo)記off位置開(kāi)始讀(off始終記錄讀的起始位置),當(dāng)off==len時(shí),表明緩沖區(qū)已全部讀完

并重置緩沖區(qū)(len=off=0),此外當(dāng)將要內(nèi)容長(zhǎng)度+已寫(xiě)的長(zhǎng)度(即len) = cap/2時(shí),緩沖區(qū)前移覆蓋掉已讀的內(nèi)容(off=0,len-=off),從避免緩沖區(qū)不斷擴(kuò)容

GO語(yǔ)言(十六):模糊測(cè)試入門(mén)(上)

本教程介紹了 Go 中模糊測(cè)試的基礎(chǔ)知識(shí)。通過(guò)模糊測(cè)試,隨機(jī)數(shù)據(jù)會(huì)針對(duì)您的測(cè)試運(yùn)行,以嘗試找出漏洞或?qū)е卤罎⒌妮斎???梢酝ㄟ^(guò)模糊測(cè)試發(fā)現(xiàn)的一些漏洞示例包括 SQL 注入、緩沖區(qū)溢出、拒絕服務(wù)和跨站點(diǎn)腳本攻擊。

在本教程中,您將為一個(gè)簡(jiǎn)單的函數(shù)編寫(xiě)一個(gè)模糊測(cè)試,運(yùn)行 go 命令,并調(diào)試和修復(fù)代碼中的問(wèn)題。

首先,為您要編寫(xiě)的代碼創(chuàng)建一個(gè)文件夾。

1、打開(kāi)命令提示符并切換到您的主目錄。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,為您的代碼創(chuàng)建一個(gè)名為 fuzz 的目錄。

3、創(chuàng)建一個(gè)模塊來(lái)保存您的代碼。

運(yùn)行g(shù)o mod init命令,為其提供新代碼的模塊路徑。

接下來(lái),您將添加一些簡(jiǎn)單的代碼來(lái)反轉(zhuǎn)字符串,稍后我們將對(duì)其進(jìn)行模糊測(cè)試。

在此步驟中,您將添加一個(gè)函數(shù)來(lái)反轉(zhuǎn)字符串。

a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 main.go 的文件。

獨(dú)立程序(與庫(kù)相反)始終位于 package 中main。

此函數(shù)將接受string,使用byte進(jìn)行循環(huán) ,并在最后返回反轉(zhuǎn)的字符串。

此函數(shù)將運(yùn)行一些Reverse操作,然后將輸出打印到命令行。這有助于查看運(yùn)行中的代碼,并可能有助于調(diào)試。

e.該main函數(shù)使用 fmt 包,因此您需要導(dǎo)入它。

第一行代碼應(yīng)如下所示:

從包含 main.go 的目錄中的命令行,運(yùn)行代碼。

可以看到原來(lái)的字符串,反轉(zhuǎn)它的結(jié)果,然后再反轉(zhuǎn)它的結(jié)果,就相當(dāng)于原來(lái)的了。

現(xiàn)在代碼正在運(yùn)行,是時(shí)候測(cè)試它了。

在這一步中,您將為Reverse函數(shù)編寫(xiě)一個(gè)基本的單元測(cè)試。

a.使用您的文本編輯器,在 fuzz 目錄中創(chuàng)建一個(gè)名為 reverse_test.go 的文件。

b.將以下代碼粘貼到 reverse_test.go 中。

這個(gè)簡(jiǎn)單的測(cè)試將斷言列出的輸入字符串將被正確反轉(zhuǎn)。

使用運(yùn)行單元測(cè)試go test

接下來(lái),您將單元測(cè)試更改為模糊測(cè)試。

單元測(cè)試有局限性,即每個(gè)輸入都必須由開(kāi)發(fā)人員添加到測(cè)試中。模糊測(cè)試的一個(gè)好處是它可以為您的代碼提供輸入,并且可以識(shí)別您提出的測(cè)試用例沒(méi)有達(dá)到的邊緣用例。

在本節(jié)中,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,這樣您就可以用更少的工作生成更多的輸入!

請(qǐng)注意,您可以將單元測(cè)試、基準(zhǔn)測(cè)試和模糊測(cè)試保存在同一個(gè) *_test.go 文件中,但對(duì)于本示例,您將單元測(cè)試轉(zhuǎn)換為模糊測(cè)試。

在您的文本編輯器中,將 reverse_test.go 中的單元測(cè)試替換為以下模糊測(cè)試。

Fuzzing 也有一些限制。在您的單元測(cè)試中,您可以預(yù)測(cè)Reverse函數(shù)的預(yù)期輸出,并驗(yàn)證實(shí)際輸出是否滿足這些預(yù)期。

例如,在測(cè)試用例Reverse("Hello, world")中,單元測(cè)試將返回指定為"dlrow ,olleH".

模糊測(cè)試時(shí),您無(wú)法預(yù)測(cè)預(yù)期輸出,因?yàn)槟鸁o(wú)法控制輸入。

但是,Reverse您可以在模糊測(cè)試中驗(yàn)證函數(shù)的一些屬性。在這個(gè)模糊測(cè)試中檢查的兩個(gè)屬性是:

(1)將字符串反轉(zhuǎn)兩次保留原始值

(2)反轉(zhuǎn)的字符串將其狀態(tài)保留為有效的 UTF-8。

注意單元測(cè)試和模糊測(cè)試之間的語(yǔ)法差異:

(3)確保新包unicode/utf8已導(dǎo)入。

隨著單元測(cè)試轉(zhuǎn)換為模糊測(cè)試,是時(shí)候再次運(yùn)行測(cè)試了。

a.在不進(jìn)行模糊測(cè)試的情況下運(yùn)行模糊測(cè)試,以確保種子輸入通過(guò)。

如果您在該文件中有其他測(cè)試,您也可以運(yùn)行g(shù)o test -run=FuzzReverse,并且您只想運(yùn)行模糊測(cè)試。

b.運(yùn)行FuzzReverse模糊測(cè)試,查看是否有任何隨機(jī)生成的字符串輸入會(huì)導(dǎo)致失敗。這是使用go test新標(biāo)志-fuzz執(zhí)行的。

模糊測(cè)試時(shí)發(fā)生故障,導(dǎo)致問(wèn)題的輸入被寫(xiě)入將在下次運(yùn)行的種子語(yǔ)料庫(kù)文件中g(shù)o test,即使沒(méi)有-fuzz標(biāo)志也是如此。要查看導(dǎo)致失敗的輸入,請(qǐng)?jiān)谖谋揪庉嬈髦写蜷_(kāi)寫(xiě)入 testdata/fuzz/FuzzReverse 目錄的語(yǔ)料庫(kù)文件。您的種子語(yǔ)料庫(kù)文件可能包含不同的字符串,但格式相同。

語(yǔ)料庫(kù)文件的第一行表示編碼版本。以下每一行代表構(gòu)成語(yǔ)料庫(kù)條目的每種類(lèi)型的值。由于 fuzz target 只需要 1 個(gè)輸入,因此版本之后只有 1 個(gè)值。

c.運(yùn)行沒(méi)有-fuzz標(biāo)志的go test; 新的失敗種子語(yǔ)料庫(kù)條目將被使用:

由于我們的測(cè)試失敗,是時(shí)候調(diào)試了。

Go語(yǔ)言中的字節(jié)序

Go中的binary包實(shí)現(xiàn)了簡(jiǎn)單的數(shù)字與字節(jié)序列的轉(zhuǎn)換以及變長(zhǎng)值的編解碼

package main

import ( "fmt" "bytes" "encoding/binary" ) func main(){ n := 0x12345678 bytesBuffer := bytes.NewBuffer([]byte{}) //BigEndian 大端順序存儲(chǔ) LittleEndian小端順序存儲(chǔ) binary.Write(bytesBuffer, binary.BigEndian, int32(n)) data:=bytesBuffer.Bytes() fmt.Printf("[0]: %#x addr:%#x\n",data[0],data[0]) fmt.Printf("[0]: %#x addr:%#x\n",data[1],data[1]) fmt.Printf("[0]: %#x addr:%#x\n",data[2],data[2]) fmt.Printf("[0]: %#x addr:%#x\n",data[3],data[3]) }

輸出

[0]: 0x12 addr:0xc042010248 [1]: 0x34 addr:0xc042010249 [2]: 0x56 addr:0xc04201024a [3]: 0x78 addr:0xc04201024b

也可以使用下面的方式

n := 0x12345678 var data []byte = make([]byte,4) //操作的都是無(wú)符號(hào)整型 binary.BigEndian.PutUint32(data,uint32(n))

可以使用下面的方式判斷當(dāng)前系統(tǒng)的字節(jié)序類(lèi)型

const INT_SIZE int = int(unsafe.Sizeof(0))

//判斷我們系統(tǒng)中的字節(jié)序類(lèi)型 func systemEdian() { var i int = 0x1 bs := (*[INT_SIZE]byte)(unsafe.Pointer(i)) if bs[0] == 0 { fmt.Println("system edian is little endian") } else { fmt.Println("system edian is big endian") } }


文章名稱(chēng):go語(yǔ)言byte占位符 golang占位符
瀏覽地址:http://weahome.cn/article/hhpccj.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部