bmp文件头定义:

word 两个字节 16bit

dword 四个字节 32bit

package main

import (

"encoding/binary"

"fmt"

"os"

)

func main() {

file, err := os.open("tim.bmp")

if err != nil {

fmt.println(err)

return

}

defer file.close()

//type拆成两个byte来读

var heada, headb byte

//read第二个参数字节序一般windows/linux大部分都是littleendian,苹果系统用bigendian

binary.read(file, binary.littleendian, &heada)

binary.read(file, binary.littleendian, &headb)

//文件大小

var size uint32

binary.read(file, binary.littleendian, &size)

//预留字节

var reserveda, reservedb uint16

binary.read(file, binary.littleendian, &reserveda)

binary.read(file, binary.littleendian, &reservedb)

//偏移字节

var offbits uint32

binary.read(file, binary.littleendian, &offbits)

fmt.println(heada, headb, size, reserveda, reservedb, offbits)

}

执行结果

66 77 196662 0 0 54

使用结构体方式

package main

import (

"encoding/binary"

"fmt"

"os"

)

type bitmapinfoheader struct {

size uint32

width int32

height int32

places uint16

bitcount uint16

compression uint32

sizeimage uint32

xperlspermeter int32

yperlspermeter int32

clsrused uint32

clrimportant uint32

}

func main() {

file, err := os.open("tim.bmp")

if err != nil {

fmt.println(err)

return

}

defer file.close()

//type拆成两个byte来读

var heada, headb byte

//read第二个参数字节序一般windows/linux大部分都是littleendian,苹果系统用bigendian

binary.read(file, binary.littleendian, &heada)

binary.read(file, binary.littleendian, &headb)

//文件大小

var size uint32

binary.read(file, binary.littleendian, &size)

//预留字节

var reserveda, reservedb uint16

binary.read(file, binary.littleendian, &reserveda)

binary.read(file, binary.littleendian, &reservedb)

//偏移字节

var offbits uint32

binary.read(file, binary.littleendian, &offbits)

fmt.println(heada, headb, size, reserveda, reservedb, offbits)

infoheader := new(bitmapinfoheader)

binary.read(file, binary.littleendian, infoheader)

fmt.println(infoheader)

}

执行结果:

66 77 196662 0 0 54

&{40 256 256 1 24 0 196608 3100 3100 0 0}

补充:golang(go语言) byte/[]byte 与 二进制形式字符串 互转

效果

把某个字节或字节数组转换成字符串01的形式,一个字节用8个”0”或”1”字符表示。

比如:

byte(3) –> “00000011”

[]byte{1,2,3} –> “[00000001 00000010 00000011]”

“[00000011 10000000]” –> []byte{0x3, 0x80}

开源库

实际上我已经将其封装到一个开源库了(),其中的一个功能就能达到上述效果:

//byte/[]byte -> string

bs := []byte{1, 2, 3}

s := biu.bytestobinarystring(bs)

fmt.println(s) //[00000001 00000010 00000011]

fmt.println(biu.bytetobinarystring(byte(3))) //00000011

//string -> []byte

s := "[00000011 10000000]"

bs := biu.binarystringtobytes(s)

fmt.printf("%#v\n", bs) //[]byte{0x3, 0x80}

代码实现

const (

zero = byte('0')

one = byte('1')

lsb = byte('[') // left square brackets

rsb = byte(']') // right square brackets

space = byte(' ')

)

var uint8arr [8]uint8

// errbadstringformat represents a error of input string's format is illegal .

var errbadstringformat = errors.new("bad string format")

// erremptystring represents a error of empty input string.

var erremptystring = errors.new("empty string")

func init() {

uint8arr[0] = 128

uint8arr[1] = 64

uint8arr[2] = 32

uint8arr[3] = 16

uint8arr[4] = 8

uint8arr[5] = 4

uint8arr[6] = 2

uint8arr[7] = 1

}

// append bytes of string in binary format.

func appendbinarystring(bs []byte, b byte) []byte {

var a byte

for i := 0; i < 8; i++ {

a = b

b <<= 1

b >>= 1

switch a {

case b:

bs = append(bs, zero)

default:

bs = append(bs, one)

}

b <<= 1

}

return bs

}

// bytetobinarystring get the string in binary format of a byte or uint8.

func bytetobinarystring(b byte) string {

buf := make([]byte, 0, 8)

buf = appendbinarystring(buf, b)

return string(buf)

}

// bytestobinarystring get the string in binary format of a []byte or []int8.

func bytestobinarystring(bs []byte) string {

l := len(bs)

bl := l*8 + l + 1

buf := make([]byte, 0, bl)

buf = append(buf, lsb)

for _, b := range bs {

buf = appendbinarystring(buf, b)

buf = append(buf, space)

}

buf[bl-1] = rsb

return string(buf)

}

// regex for delete useless string which is going to be in binary format.

var rbdel = regexp.mustcompile(`[^01]`)

// binarystringtobytes get the binary bytes according to the

// input string which is in binary format.

func binarystringtobytes(s string) (bs []byte) {

if len(s) == 0 {

panic(erremptystring)

}

s = rbdel.replaceallstring(s, "")

l := len(s)

if l == 0 {

panic(errbadstringformat)

}

mo := l % 8

l /= 8

if mo != 0 {

l++

}

bs = make([]byte, 0, l)

mo = 8 - mo

var n uint8

for i, b := range []byte(s) {

m := (i + mo) % 8

switch b {

case one:

n += uint8arr[m]

}

if m == 7 {

bs = append(bs, n)

n = 0

}

}

return

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持萬仟网。如有错误或未考虑完全的地方,望不吝赐教。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

python读取bmp文件,go 读取BMP文件头二进制读取方式相关推荐

  1. python如何区分文件类型_python通过文件头判断文件类型

    对于提供上传的服务器,需要对上传的文件进行过滤. 本文为大家提供了python通过文件头判断文件类型的方法,避免不必要的麻烦. 分享代码如下 import struct # 支持文件类型 # 用16进 ...

  2. linux c 读取txt文件中数据类型,关于matlab中用textread读取txt文件

    今天打算跑下程序,突然发现,真的很烂,不会读入数据,简单的Iris.txt一上午都没读进去,在此对matlab中的textread函数做下总结,textscan函数待续. 笔者在此基础上进行运行,修改 ...

  3. 乐鑫esp8266学习rtos3.0笔记:esp产品 如何从外部读取 csv 文件的数据,比如从代码读取外部文件阿里云三元组。(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  4. 记:ELF文件解析初定义——文件头解析

    0x00 概论 因为TI的DSP输出文件与传统的ELF文件不符,所以本人就顺道研究了一下现在的ELF的文件格式. 会将其陆续完成在文章中. 阅读本文之前,您需要掌握的技能有: 技能名称 技能熟练度 技 ...

  5. ART世界探险(12) - OAT文件分析(2) - ELF文件头分析(中)

    ART世界探险(12) - OAT文件分析(2) - ELF文件头分析(中) 段(section)的概念 一块内存分配给应用程序之后,从代码的组织上,我们就有将它们分段的需求. 比如,可以分为代码段, ...

  6. mfc读取bmp文件_LIUNX 工程bmp.c 显示图片 开发板出来的图片只有一个角 求大佬解决...

    #include <stdio.h> //open头文件 #include <sys/stat.h> #include <fcntl.h> //write 头文件 ...

  7. python怎么读取txt文件内容然后保存到excel-Python实现读取txt文件并转换为excel的方法示例...

    本文实例讲述了Python实现读取txt文件并转换为excel的方法.分享给大家供大家参考,具体如下: 这里的txt文件内容格式为: 892天平天国定都在?A开封B南京C北京(B) Python代码如 ...

  8. python一次性读取整个文件-python-文件中的行是否读取整个文件

    您不能确定.您所知道的只是它一次将返回一行. Python Standard Library documentation说: 为了使for循环成为遍历文件行的最有效方法(一种非常常见的操作),next ...

  9. C# 读取ini文件 百度问问学习文档

    C# 读取ini文件 10 有多个section,现想读取整个ini文件和指定section下所有内容 补充: 发布答案可以,请对准题目啊,我不要指定节点的内容,我知道!我要的是读取指定区域的内容,假 ...

  10. python读取大文件的某行_Python按行读取文件的实现方法【小文件和大文件读取】...

    本文实例讲述了Python按行读取文件的实现方法.分享给大家供大家参考,具体如下: 小文件: #coding=utf-8 #author: walker #date: 2013-12-30 #func ...

最新文章

  1. Spark入门系列(二)| 1小时学会RDD编程
  2. c语言二级编程题答案免费下载,全国计算机等级考试二级C语言上机编程题参考答案...
  3. 三国志幻想大陆服务器维护,三国志幻想大陆8月14日更新维护公告
  4. Matlab实用程序--图形应用-轮廓图
  5. Py之prettytable:prettytable的简介、安装、使用方法之详细攻略
  6. java判断或_Java 条件判断
  7. LabVIEW(七):多态VI
  8. 【js】鼠标跟随效果
  9. 中国晶体谐振器行业市场供需与战略研究报告
  10. HDU2525 Clone Wars【模拟】
  11. UNIX环境高级编程 第7章 进程环境
  12. 分析vue-cli@2.9.3 搭建的webpack项目工程 1
  13. eTerm指令、民航指令大全、黑屏指令
  14. python之t分布
  15. 关于DBSCAN聚类算法
  16. 开发板实战篇4 RGB565 LCD刷颜色数据
  17. 闲鱼平台API,item_app获得闲鱼原生数据
  18. 一款轻巧简单疫情动态网站源码
  19. 细胞制备流程图_Nat Med背靠背丨 疗效差?毒性大?B细胞恶性肿瘤的CAR-T免疫治疗或可出现新进展...
  20. Altium Designer Pcb 快捷键

热门文章

  1. 181021词霸有道扇贝每日一句
  2. Atitit 提升可读性sql subquery udf 子查询 目录 1. 使用udf 和参数@简化join和subquery 1 1.1.1. 子查询分类 1 2. 2.1 按返回结果集分类
  3. Atitit 知识图谱管理 谱存储选型 与查询 目录 1. 知识图谱存储系统的选型。 1 1.1. 图数据库 neo4j 适合大规模数据 1 1.2. 关系数据库 小规模 2 2. 知识图谱查询语言
  4. Atitit 微服务之道 attilax著 1. 什么是微服务架构? 1 1.1. 、微服务与SOA的关系 :微服务架架构师面向服务架构(SOA)的一种特定实现 2 1.2. 微服务与康威定律 2 1
  5. atitit.TokenService  token服务模块的设计
  6. atitit.javascript js 上传文件的本地预览
  7. paip.sql2008 客户端软件绿色版V319
  8. paip.提升用户体验---注册异常记录
  9. (转)招行开启零售银行智能投顾时代 尝试打造金融垂直自场景
  10. 云原生时代,分布式系统设计必备知识图谱(内含22个知识点)