go 读取BMP文件头二进制读取方式
来源:脚本之家
2022-12-28 10:51:36
0浏览
收藏
本篇文章给大家分享《go 读取BMP文件头二进制读取方式》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。
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}
开源库 biu
实际上我已经将其封装到一个开源库了(biu),其中的一个功能就能达到上述效果:
//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 >= 1 switch a { case b: bs = append(bs, zero) default: bs = append(bs, one) } b <p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持golang学习网。如有错误或未考虑完全的地方,望不吝赐教。</p><p>今天带大家了解了二进制、goBMP、文件头的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~</p>
版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除

- 上一篇
- golang移除数组中重复的元素操作

- 下一篇
- 解决Go语言数据库中null值的问题
评论列表
-
- 健忘的微笑
- 太细致了,mark,感谢楼主的这篇文章内容,我会继续支持!
- 2023-02-03 04:37:22
-
- 机灵的酒窝
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢老哥分享博文!
- 2023-02-02 19:33:59
-
- 沉默的硬币
- 太全面了,收藏了,感谢师傅的这篇文章内容,我会继续支持!
- 2023-01-20 16:36:18
-
- 踏实的宝马
- 这篇博文真及时,老哥加油!
- 2023-01-19 12:26:18
-
- 明亮的御姐
- 这篇博文真是及时雨啊,太细致了,写的不错,mark,关注作者了!希望作者能多写Golang相关的文章。
- 2023-01-12 21:03:02
-
- 鳗鱼草丛
- 这篇技术贴真是及时雨啊,太全面了,很棒,收藏了,关注up主了!希望up主能多写Golang相关的文章。
- 2023-01-05 19:27:37
-
- 斯文的画板
- 很好,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢老哥分享文章内容!
- 2022-12-31 12:12:11
查看更多
最新文章
-
- Golang · Go教程 | 4分钟前 |
- Golang字符串拼接方法对比及优化方案
- 129浏览 收藏
-
- Golang · Go教程 | 12分钟前 |
- Golang模板引擎教程:html/template与第三方对比
- 408浏览 收藏
-
- Golang · Go教程 | 13分钟前 |
- Golang优化云原生启动,轻量二进制冷启动优势解析
- 163浏览 收藏
-
- Golang · Go教程 | 19分钟前 |
- Golang加速DevOps镜像构建技巧
- 248浏览 收藏
-
- Golang · Go教程 | 27分钟前 |
- Go语言panic与recover机制解析
- 195浏览 收藏
-
- Golang · Go教程 | 32分钟前 |
- JWT与mTLS认证实战教程
- 292浏览 收藏
-
- Golang · Go教程 | 44分钟前 |
- 优化cgo调用性能的实用技巧
- 217浏览 收藏
-
- Golang · Go教程 | 46分钟前 |
- 用Golang开发K8s准入控制器教程
- 324浏览 收藏
-
- Golang · Go教程 | 51分钟前 |
- Golangselect原理与case执行顺序详解
- 399浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang工厂模式:简单工厂与抽象工厂对比
- 160浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang错误处理性能影响分析
- 198浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
查看更多
AI推荐
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 95次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 89次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 106次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 98次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 98次使用
查看更多
相关文章
-
- golang 如何删除二进制文件中的源码路径信息
- 2023-01-07 353浏览
-
- Golang二进制文件混淆保护操作
- 2022-12-30 262浏览
-
- 减少 golang 二进制文件大小操作
- 2022-12-28 397浏览
-
- 浅谈golang二进制bit位的常用操作
- 2023-01-07 219浏览
-
- go实现整型的二进制转化的方法
- 2023-02-16 487浏览