python读取bmp文件,go 读取BMP文件头二进制读取方式
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文件头二进制读取方式相关推荐
- python如何区分文件类型_python通过文件头判断文件类型
对于提供上传的服务器,需要对上传的文件进行过滤. 本文为大家提供了python通过文件头判断文件类型的方法,避免不必要的麻烦. 分享代码如下 import struct # 支持文件类型 # 用16进 ...
- linux c 读取txt文件中数据类型,关于matlab中用textread读取txt文件
今天打算跑下程序,突然发现,真的很烂,不会读入数据,简单的Iris.txt一上午都没读进去,在此对matlab中的textread函数做下总结,textscan函数待续. 笔者在此基础上进行运行,修改 ...
- 乐鑫esp8266学习rtos3.0笔记:esp产品 如何从外部读取 csv 文件的数据,比如从代码读取外部文件阿里云三元组。(附带demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...
- 记:ELF文件解析初定义——文件头解析
0x00 概论 因为TI的DSP输出文件与传统的ELF文件不符,所以本人就顺道研究了一下现在的ELF的文件格式. 会将其陆续完成在文章中. 阅读本文之前,您需要掌握的技能有: 技能名称 技能熟练度 技 ...
- ART世界探险(12) - OAT文件分析(2) - ELF文件头分析(中)
ART世界探险(12) - OAT文件分析(2) - ELF文件头分析(中) 段(section)的概念 一块内存分配给应用程序之后,从代码的组织上,我们就有将它们分段的需求. 比如,可以分为代码段, ...
- mfc读取bmp文件_LIUNX 工程bmp.c 显示图片 开发板出来的图片只有一个角 求大佬解决...
#include <stdio.h> //open头文件 #include <sys/stat.h> #include <fcntl.h> //write 头文件 ...
- python怎么读取txt文件内容然后保存到excel-Python实现读取txt文件并转换为excel的方法示例...
本文实例讲述了Python实现读取txt文件并转换为excel的方法.分享给大家供大家参考,具体如下: 这里的txt文件内容格式为: 892天平天国定都在?A开封B南京C北京(B) Python代码如 ...
- python一次性读取整个文件-python-文件中的行是否读取整个文件
您不能确定.您所知道的只是它一次将返回一行. Python Standard Library documentation说: 为了使for循环成为遍历文件行的最有效方法(一种非常常见的操作),next ...
- C# 读取ini文件 百度问问学习文档
C# 读取ini文件 10 有多个section,现想读取整个ini文件和指定section下所有内容 补充: 发布答案可以,请对准题目啊,我不要指定节点的内容,我知道!我要的是读取指定区域的内容,假 ...
- python读取大文件的某行_Python按行读取文件的实现方法【小文件和大文件读取】...
本文实例讲述了Python按行读取文件的实现方法.分享给大家供大家参考,具体如下: 小文件: #coding=utf-8 #author: walker #date: 2013-12-30 #func ...
最新文章
- Spark入门系列(二)| 1小时学会RDD编程
- c语言二级编程题答案免费下载,全国计算机等级考试二级C语言上机编程题参考答案...
- 三国志幻想大陆服务器维护,三国志幻想大陆8月14日更新维护公告
- Matlab实用程序--图形应用-轮廓图
- Py之prettytable:prettytable的简介、安装、使用方法之详细攻略
- java判断或_Java 条件判断
- LabVIEW(七):多态VI
- 【js】鼠标跟随效果
- 中国晶体谐振器行业市场供需与战略研究报告
- HDU2525 Clone Wars【模拟】
- UNIX环境高级编程 第7章 进程环境
- 分析vue-cli@2.9.3 搭建的webpack项目工程 1
- eTerm指令、民航指令大全、黑屏指令
- python之t分布
- 关于DBSCAN聚类算法
- 开发板实战篇4 RGB565 LCD刷颜色数据
- 闲鱼平台API,item_app获得闲鱼原生数据
- 一款轻巧简单疫情动态网站源码
- 细胞制备流程图_Nat Med背靠背丨 疗效差?毒性大?B细胞恶性肿瘤的CAR-T免疫治疗或可出现新进展...
- Altium Designer Pcb 快捷键
热门文章
- 181021词霸有道扇贝每日一句
- Atitit 提升可读性sql subquery udf 子查询 目录 1. 使用udf 和参数@简化join和subquery	1 1.1.1. 子查询分类	1 2. 2.1 按返回结果集分类
- Atitit 知识图谱管理 谱存储选型 与查询 目录 1. 知识图谱存储系统的选型。	1 1.1. 图数据库 neo4j 适合大规模数据	1 1.2. 关系数据库 小规模	2 2. 知识图谱查询语言
- Atitit 微服务之道 attilax著 1. 什么是微服务架构?	1 1.1. 、微服务与SOA的关系 :微服务架架构师面向服务架构(SOA)的一种特定实现	2 1.2. 微服务与康威定律	2 1
- atitit.TokenService token服务模块的设计
- atitit.javascript js 上传文件的本地预览
- paip.sql2008 客户端软件绿色版V319
- paip.提升用户体验---注册异常记录
- (转)招行开启零售银行智能投顾时代 尝试打造金融垂直自场景
- 云原生时代,分布式系统设计必备知识图谱(内含22个知识点)