golang判断某个文件内容是否是二进制文件方法, LimitReader, 获取文件大小,字符串0写入后的byte数据为48, byte零值

go语言中判断某个文件是否是二进制文件的方法, 通过LimitReader读取指定大小的数据后对数据进行判断, 这里有一个很有趣的知识点就是 字符串0在写入文件后,再通过io read读取后的byte数据他在内存中显示的可不是0 而是变成了 48, 十六进制 0x30。

判断某个文件内容是否二进制示例函数


// IsBinaryFile 是否二进制文件(且存在)
// fname 要判断的文件名 包含路径
// 是二进制文件 返回 true , 否则返回false
// @author tekintian <tekintian@gmail.com>
func IsBinaryFile(fname string) bool {
	f, err := os.Open(fname)
	if err != nil {
		return false
	}
	var maxR int64
	// 通过文件统计信息 获取文件大小
	if fi, err := f.Stat(); err == nil {
		maxR = fi.Size()
	}
	if maxR == 0 { // 如果文件内容为空,字节返回false
		return false
	}
	if maxR > 32 { // 最多读取32个字节 判断是否binary应该是足够了
		maxR = 32
	}
	// 只读取指定大小的数据 LimitReader
	reader := io.LimitReader(f, maxR)
	fbs := make([]byte, maxR)
	if _, err := reader.Read(fbs); err != nil {
		return false
	}
	for _, v := range fbs {
		// 读取的字节切片中如果有 v==0 说明这个文件是二进制文件. 注意字符串0的byte是48 十六进制 0x30 !!!
		if v == 0 {
			return true
		}
	}
	return false
}

测试用例

package myfile_test

import (
	"gotms/utils/myfile"
	"testing"
)

func makeBinaryFile() {
	// 写入一个测试文件
	myfile.WriteFile("test.bin", []byte("000 hello world 123"))
}

func TestIsBinaryFile(t *testing.T) {
	makeBinaryFile()
	ret := myfile.IsBinaryFile("test.bin")
	if !ret {
		t.Fatal("Failed to test binary")
	}

}

[]byte零值

byte切片的零值内存中是0, 字符串表现形式是 \x00,  因此我们在定义用于读取文件内容的[]byte时是不能超过文件大小的,否则判断就不准确了!

字符串0读取后的byte数值 48 十六进制 0x30

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值