簡體   English   中英

如何在 Node.js 中正確執行 Git 兼容的十六進制 sha 打包/壓縮

[英]How to do proper Git compatible hex sha packing/compression in Node.js

我目前正在嘗試將 ruby 代碼移植到 javascript。 我有這個

ENTRY_FORMAT = "A7Z*H40"
mode = "100644"
fileName = "tree.js"
sha= "baae99010b237a699ff0aba02fd5310c18903b1b"
[mode, filename, sha].pack(ENTRY_FORMAT)

其中 MODE、entry.name 和 entry.oid 是字符串

• A7:這將第一個字符串 MODE 編碼為一個在右側用空格填充的七字節字符串

• Z*:這將第二個字符串 entry.name 編碼為任意長度的空填充字符串,也就是說,它按原樣表示字符串,並在末尾附加一個 null 字節

•H40:這通過將每對數字打包成一個字節來編碼一個由四十個十六進制數字組成的字符串entry.oid,正如我們在第 2.3.3 節“磁盤上的樹”中看到的那樣

我可以在 javaScript 中執行此操作嗎?

我假設您的意思是mode也是一個字符串。

 let fileName = "file.js"; let sha = "baae99010b237a699ff0aba02fd5310c18903b1b"; let mode = '100664'; // encode all into bytes let enc = new TextEncoder(); let modeArray = enc.encode(mode.padEnd(7)); let fileNameArray = enc.encode(fileName + '\0'); let shaArray = Uint8Array.from(sha.match(/../g), x => parseInt(x, 16)); // concatenate together let array = new Uint8Array([...modeArray, ...fileNameArray, ...shaArray]); console.log(array);

Node.js 具有Buffer class,它簡化了其中一些操作:

let modeBuffer = Buffer.from(mode.padEnd(7));
let fileNameBuffer = Buffer.from(fileName + '\0');
let shaBuffer = Buffer.from(sha, 'hex');
let buffer = Buffer.concat([modeBuffer, fileNameBuffer, shaBuffer]);
// can fs.writeFile(file, buffer, ...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM