首页 > 其他分享 >tar文件header的格式和构造

tar文件header的格式和构造

时间:2024-05-11 11:30:24浏览次数:11  
标签:12 tar 48 char header 格式 hc 100 ASCILL

Header定义

// standard archive format - standard tar - ustar
struct TarHeader {
  char name[100];      // 0  -99
  char mode[8];        // 100-107
  char uid[8];         // 108-115
  char gid[8];         // 116-123
  char size[12];       // 124-135
  char mtime[12];      // 136-147
  char chksum[8];      // 148-155
  char typeflag;       // 156
  char linkname[100];  // 157-256
  char magic[8];       // 257-264
  char uname[32];      // 265-296
  char gname[32];      // 297-328
  char devmajor[8];    // 329-336
  char devminor[8];    // 337-344
  char prefix[155];    // 345-499
  char padding[12];    // 500-511
};
  • tar文件header固定长度为512byte
  • 512byte全部由ASCILL码填充
  • 未设置的字段填充0(ASCILL码中为空字符)
  • 字段分为字符串和数值
  • 字符串
    • 以name为例,字符串按每个字符,转换为ASCILL码后填充
    • 从0开始填充,假设写入name为bin
    • 在数组中显示为[98 105 110 0 ... 0]
  • 数值
    • 以size为例,以八进制处理数值124-134填充ASCILL码
    • 135保留ASCILL码空字符
    • 124-134每一位都要写入,为0的写入48(ASCILL码中的0)
    • 假设写入size为114514
    • 在数组中显示为[48 48 48 48 48 51 51 55 53 50 50 0]
    • 字符串显示为00000337522�
  • 特殊字段magic
    • 固定值,为ustar(null)00
    • 在数组中显示为[117 115 116 97 114 0 48 48]

Header构造的golang实现

package util

import (
	"fmt"
	"time"
	"unicode/utf8"
)

type TarHeaderCreater struct {
	// | name     | 100 | 0  -99  |
	// | mode     | 8   | 100-107 |
	// | uid      | 8   | 108-115 |
	// | gid      | 8   | 116-123 |
	// | size     | 12  | 124-135 |
	// | mtime    | 12  | 136-147 |
	// | chksum   | 8   | 148-155 |
	// | typeflag | 1   | 156
	// | linkname | 100 | 157-256 |
	// | magic    | 8   | 257-264 |
	// | uname    | 32  | 265-296 |
	// | gname    | 32  | 297-328 |
	// | devmajor | 8   | 329-336 |
	// | devminor | 8   | 337-344 |
	// | prefix   | 155 | 345-499 |
	// | padding  | 12  | 500-511 |
	buf [512]byte
}

func (hc *TarHeaderCreater) Init() {
	// Init all 0
	for i := 0; i < 512; i++ {
		hc.buf[i] = 0
	}
	// magic
	hc.writeChar(257, "ustar")
	hc.writeInt(263, 264, 0)
	// devmajor
	hc.writeInt(329, 335, 0)
	// devminor
	hc.writeInt(337, 343, 0)
}

func (hc *TarHeaderCreater) writeChar(start int, str string) error {
	for i, c := range str {
		if c < utf8.RuneSelf {
			hc.buf[start+i] = byte(int(c))
		} else {
			return fmt.Errorf("fail to change char: %c to ASCII", c)
		}
	}
	return nil
}

func (hc *TarHeaderCreater) writeInt(start, end, val int64) {
	for i := end; i >= start; i-- {
		if val <= 0 {
			hc.buf[i] = byte(48)
		} else {
			tmp := val % 8
			val /= 8
			hc.buf[i] = byte(tmp + 48)
		}
	}
}

func (hc *TarHeaderCreater) SetName(name string) error {
	return hc.writeChar(0, name)
}

func (hc *TarHeaderCreater) SetMode(mode int64) {
	hc.writeInt(100, 106, mode)
}

func (hc *TarHeaderCreater) SetUid(uid int64) {
	hc.writeInt(108, 114, uid)
}

func (hc *TarHeaderCreater) SetGid(gid int64) {
	hc.writeInt(116, 122, gid)
}

func (hc *TarHeaderCreater) SetTypeFlag(b byte) {
	hc.buf[156] = b
}

func (hc *TarHeaderCreater) SetLinkName(linkName string) error {
	return hc.writeChar(157, linkName)
}

func (hc *TarHeaderCreater) SetModTime(modeTime string) error {
	t, err := time.Parse("2006-01-02T15:04:05Z07:00", modeTime)
	if err != nil {
		return err
	}
	hc.writeInt(136, 146, t.Unix())
	return nil
}

func (hc *TarHeaderCreater) SetSize(size int64) {
	hc.writeInt(124, 134, size)
}

func (hc *TarHeaderCreater) SetChksum() {
	chksum := int64(256)
	for _, b := range hc.buf {
		chksum += int64(b)
	}
	hc.writeInt(148, 153, chksum)
	hc.buf[155] = 32
}

标签:12,tar,48,char,header,格式,hc,100,ASCILL
From: https://www.cnblogs.com/umichan0621/p/18186171

相关文章

  • inspectAR - PCB增强现实工具包+Wireshark - 最广泛使用的开源网络协议分析器
    1、Wireshark-最广泛使用的开源网络协议分析器Wireshark是世界上最重要的、被广泛使用的网络协议分析器。Wireshark可以从以太网,IEEE802.11,PPP/HDLC,ATM,蓝牙,USB,令牌环,帧中继,FDDI和其他(取决于你的平台)读取实时数据。软件官网:https://www.wireshark.org/Wireshark......
  • mysql Code: 1093. You can't specify target table for update in FROM clause
    执行如下sql会报错,大概是delete的where条件里面不能包含自身的表deletefromt_plan_newwhereplan2codeisnotnullandplan2versionisnotnulland(plan2code,plan2version)notin(selectplan2code,max(plan2version)fromt_plan_newgroupbyplan2code) 所以用临......
  • StarCoder2-Instruct: 完全透明和可自我对齐的代码生成
    指令微调是一种技术,它能让大语言模型(LLMs)更好地理解和遵循人类的指令。但是,在编程任务中,大多数模型的微调都是基于人类编写的指令(这需要很高的成本)或者是由大型专有LLMs生成的指令(可能不允许使用)。我们推出了一个叫做StarCoder2-15B-Instruct-v0.1的模型,这是第......
  • NewStarCTF 2023 week1 writeup
    NewStarCTF2023week1writeup花了几天时间,终于把week1的题目做完了,还是学到不少东西的,题目质量大多都挺高的,很适合新手入门。Web1.泄漏的秘密url/robots.txt查看robots协议,找到第一部分的flagPARTONE:flag{r0bots_1s_s0_us3fulurl/www.zip查看网站备份,找到第二部分的fla......
  • 如何快速断行、分割行、切割行、换行、限制每行字数、平均分割每行字数、序号自动换行
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z 打开工具,切换到“文章工作域”(嗯...默认就是) 找到这个,多内容断行分割点击打开,出现如下窗口设置   相关的设置都在上面,涉及的功能有:限制每行字数、根据行数均等字数的换行、整理出指定关键内容起......
  • c# 图片格式转换
    ImageConvert(@"E:\素材\xx.png",@"E:\素材\xx.ico");publicstaticvoidImageConvert(stringimagePath,stringoutPath){Imageimg=Image.FromFile(imagePath);varwidth=32;varheight=32;Sizesize;if((w......
  • CSS在线格式化、美化、压缩工具
    网上有不少CSS格式化压缩的工具,但是不少站点有广告干扰,或操作起来不方便,或打开速度比较慢,所以自己定制了这个css格式化压缩的工具,也希望对大家有帮助,提供的这个CSS代码格式化和css在线压缩工具,不需要下载使用YUICompressor或CSSTidy等离线格式化工具,直接在线压缩操作即可。免......
  • html格式化压缩美化工具
    html格式化工具为您提供html格式化,html美化排版,html压缩工具,html在线格式化,html代码在线格式化,html在线压缩,html格式化,可以将凌乱的前端html代码整理的整整齐齐,凌乱的html代码不好调试,冗余代码多了也会严重影响速度,当你在为提高了用户体验,做出了很绚丽的效果而欣喜的时候......
  • json在线解析及格式化工具
    JSON可以将程序语言对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式,例如在PHP中,可以将JSON还原为数组或者一个基本对象。在用到AJAX时,如果需要用到数组传值,这时就需要用JSON将数组转化......
  • FFMpegCore 对音视频格式转换
    下载Nuget包FFMpegCore FFMpeg的官网下载转码程序点击Dowload 选择对应系统的下载源本次为Windows系统 选择Full标记的压缩包 解压后的文件结构ffmpeg版本 将bin文件夹下的ffmpeg.exe文件放置在程序项目的根目录下  视频格式转换以下是将.mov转.mp4///......