golang保存二進(jìn)制文件會有大小端問題。
日照網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)公司于2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運(yùn)維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
這個二進(jìn)制文件的確有Big Endian 和Little Endian的問題,這個與CPU指令體系有關(guān),不過不用操心,像JPEG就是Big Endian,其編解碼就都是按照這個約定來完成的,沒有平臺問題,也沒有大小端的問題。
編譯centos上的可執(zhí)行文件的時候需要交叉編譯。golang的交叉編譯很容易,你的情況的話用下面這條命令,GOOS=linux GOARCH=amd64 go build ./文件。
golang描述:
Go的語法接近C語言,但對于變量的聲明有所不同。Go支持垃圾回收功能。Go的并行模型是以東尼·霍爾的通信順序進(jìn)程(CSP)為基礎(chǔ)。
采取類似模型的其他語言包括Occam和Limbo,但它也具有Pi運(yùn)算的特征,比如通道傳輸。在1.8版本中開放插件(Plugin)的支持,這意味著現(xiàn)在能從Go中動態(tài)加載部分函數(shù)。
與C++相比,Go并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數(shù)等功能,但增加了 切片(Slice) 型、并發(fā)、管道、垃圾回收、接口(Interface)等特性的語言級支持。Go 2.0版本將支持泛型,對于斷言的存在,則持負(fù)面態(tài)度,同時也為自己不提供類型繼承來辯護(hù)。
由于我們的 Dockerfile 使用多階段構(gòu)建,
由于 alpine 鏡像非常小,只有 5 mb 左右,但是由于客戶那邊強(qiáng)制要使用紅帽的基礎(chǔ)鏡像,所以在第二階段修改成紅帽的鏡像,最終打成的鏡像運(yùn)行的時候會提示 No such file or directory 。
這個問題的原因在于第一階段構(gòu)建的環(huán)境和第二階段的運(yùn)行的環(huán)境不一致,很多時候以為都是 Linux 環(huán)境,怎么可能不一致呢,但是由于 Linux 的各個發(fā)行版都有自己定制化的部分,就譬如 alpine 分支,他的 C 語言動態(tài)鏈接庫使用的是 musl,而像 centos 用的都是 glibc,他們都是 c 語言的標(biāo)準(zhǔn)庫,用來調(diào)用操作系統(tǒng)的庫。
上面說的是一方面原因,但是不是這個問題的最具體的原因。
go build 打包出來的二進(jìn)制文件還寫一個非常重要的信息 interpreter 。
我將二進(jìn)制文件從容器內(nèi) copy 出來通過 file 查看
可以看到二進(jìn)制的文件上有些一個解釋器的地址,這個文件地址是寫死在二進(jìn)制文件上的,后面我啟動一個 centos 容器。
果然報了同樣的一個錯誤。
Linux 如何啟動一個二進(jìn)制文件可以參考一下參考文檔,就是通過這個解釋器出發(fā)將程序調(diào)入內(nèi)存。
func ByteToBinaryString(data byte) (str string) {
var a byte
for i:=0; i 8; i++ {
a = data
data = 1
data = 1
switch (a) {
case data: str += "0"
default: str += "1"
}
data = 1
}
return str
}
//該代碼片段來自于:
使用方法package main
import . "fmt"
func main() {
Printf("[%s][%s][%s][%s]\n",
ByteToBinaryString(byte(0)),ByteToBinaryString(byte(231)),
ByteToBinaryString(byte(168)), ByteToBinaryString(byte(162)))
}
我們需要對一些文本進(jìn)行"明文加密",何為"明文加密"?
從一些錯亂的數(shù)據(jù)中,提取我們想要的數(shù)據(jù).
生成錯亂的數(shù)據(jù)(可以隨機(jī)生成)
只需從上面的字符串提取數(shù)字即可,45.89.0.8
這里只是舉個簡單例子
這樣就會該go文件同級目錄生成bin文件
并未使用binary.Read()方法
讀取到的文本
再根據(jù)自己的規(guī)則去提取該字符中你想要的數(shù)據(jù)即可.