亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Go 中進行適當的 Git 兼容的 hex sha 打包/壓縮

如何在 Go 中進行適當的 Git 兼容的 hex sha 打包/壓縮

Go
MM們 2023-06-19 15:56:14
我已經到了需要將文件內容的壓縮哈希值存儲到樹中以寫入磁盤的部分,但是我在執行 Git 正在尋找的這種十六進制壓縮/打包時遇到了麻煩。這是我正在使用的 Ruby 代碼ENTRY_FORMAT = "A7Z*H40"MODE = "100644"FILE_NAME = "tree.rb"SHA = "baae99010b237a699ff0aba02fd5310c18903b1b"[MODE, FILE_NAME , SHA].pack(ENTRY_FORMAT)顯然是 Ruby pack 方法:Array#pack 方法采用各種值的數組并返回表示這些值的字符串。每個值在字符串中的確切表示方式由我們傳遞給 pack 的格式字符串決定。的編碼,MODE我FILE_NAME認為我很擅長。這是編碼我正在努力處理的 sha 的最后一部分。&bull; H40:通過將每對數字打包成一個字節來編碼一個包含四十個十六進制數字的字符串 entry.oid這是&ldquo;將每對數字打包成一個字節,我無法理解。這是我目前的嘗試:mode := 100644fileName := "tree.go"sha:= "baae99010b237a699ff0aba02fd5310c18903b1b"http:// slice of strings for constructing the packed shavar eid []string// iterate through each character in idfor i := 0; i < len(sha); i += 2 {? ? // gathering them in pairs of two? ? one, two := sha[i], sha[i+1]? ? // compress two digits into one byte? ? // using bitwise or?? addition?? bit shifting?? not sure.? ? eid = append(eid, string(one|two))}// concat the new packed id with the mode and file name.stringRep := fmt.Sprintf("%-7d", mode) + fileName + "\x00" + strings.Join(eid, "")去操場上面的代碼因此,由于某種我無法弄清楚的原因,函數生成的樹條目的字符串表示與 Git 在磁盤上存儲樹的方式不兼容。我試過在or讀取它們之前移動這些位,我試過將字節加在一起,但似乎沒有任何效果。我基本上需要Array#pack以 Git 接受的方式復制 Ruby 方法的行為。非常感謝任何指導或建議。如有必要,我很樂意解釋更多或發布更多代碼示例。非常感謝您的參與!PS 更多關于打包 git 執行的上下文,來自 Building GitGit 以壓縮格式存儲每個條目的 ID,每個條目使用 20 個字節。每個十六進制數字代表一個從零到十五的數字,其中十用 a 表示,十一用 b 等等,直到 f 表示十五。在一個四十位的對象 ID 中,每個數字代表一個 160 位數字中的四位。我們可以將其分成二十個八位塊,而不是將這些位分成四十塊,每塊四位&mdash;&mdash;八位是一個字節。所以這里發生的一切就是 160 位對象 ID 以二進制形式存儲為 20 個字節,而不是代表十六進制數字的 40 個字符。
查看完整描述

1 回答

?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

hex在包中可以找到二進制和十六進制字符串之間轉換的函數。

例如:將輸入的十六進制字符串轉換為字節數組(其中每個字節包含兩個初始十六進制字符串數字)的函數是 --hex.DecodeString或者hex.Decode如果您的輸入是 a[]byte而不是string.


如果你想重新實現這個功能:

  • 輸入字符串的每個字符都應轉換為其數值,

  • 每對值都應被視為 base 16 中的數字:var newByte byte = 16*one + two


查看完整回答
反對 回復 2023-06-19
  • 1 回答
  • 0 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號