繁体   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