惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog RSS Feed
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google Online Security Blog
Google Online Security Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
The GitHub Blog
The GitHub Blog
N
News and Events Feed by Topic
Security Archives - TechRepublic
Security Archives - TechRepublic
D
DataBreaches.Net
阮一峰的网络日志
阮一峰的网络日志
H
Heimdal Security Blog
PCI Perspectives
PCI Perspectives
A
About on SuperTechFans
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
博客园_首页
Vercel News
Vercel News
H
Hacker News: Front Page
WordPress大学
WordPress大学
Hacker News: Ask HN
Hacker News: Ask HN
MyScale Blog
MyScale Blog
Recent Announcements
Recent Announcements
N
News | PayPal Newsroom
T
Threatpost
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
SecWiki News
SecWiki News
D
Docker
G
Google Developers Blog
L
LINUX DO - 最新话题
O
OpenAI News
S
Schneier on Security
AI
AI
T
The Exploit Database - CXSecurity.com
S
Security Affairs
I
Intezer
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Security Latest
Security Latest
博客园 - 司徒正美
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
T
Troy Hunt's Blog
L
LINUX DO - 热门话题

博客园 - 真 OO无双

(轉貼) Bit Twiddling Hacks (SOC) (Verilog) (C) (筆記) 如何移除VirtualBox所遺留下的驅動程式? (SOC) (VirtualBox) (筆記) always block內省略else所代表的電路 (SOC) (Verilog) (原創) 如何在Qsys Subsystem使用Interrupt? (SOC) (Nios II) (Qsys) (原創) Qsys或RTL做修改後,Nios II SBT該如何面對新的硬體? (SOC) (Nios II) (Qsys) (原創) 如何解決目錄改變時,Nios II project無法編譯的問題? (SOC) (Nios II) (DE2-70) (原創) Qsys Generation Tab的Simulation設定的意義 (SOC) (Nios II) (Qsys) (筆記) 如何寫入binary file某個byte連續n byte的值? (C/C++) (C) (筆記) 如何寫入binary file某個byte的值? (C/C++) (C) (筆記) 如何讀取binary file某個byte的值? (C/C++) (C) (原創) Altera Technology Roadshow 2011 Taipei (SOC) (Quartus II) (Nios II) (Qsys) (原創) 如何在安裝SELinux的環境執行Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (筆記) 如何得知Quartus II最新版到底修改了哪些東西? (SOC) (Quartus II) (Nios II) (SOPC Builder) (Qsys) (筆記) Qsys resource整理 (SOC) (Nios II) (Qsys) (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox) (筆記) 如何在RedHat Linux安裝VirtualBox Guest Additions? (SOC) (Linux) (RedHat) (VirtualBox) (筆記) 常用設定暫存器值的編程技巧 (SOC) (C/C++) (C) (Verilog) (原創) Quartus II安裝新觀念:如何將Quartus II安裝在VirtualBox內? (SOC) (Quartus II) (VirtualBox) (筆記) $dispaly()、$strobe()、$monitor() 、$fwrite()與blocking / nonblocking的關係 (SOC) (Verilog) (Debussy) (Verdi)
(筆記) 如何讀取binary file某個byte連續n byte的值? (C/C++) (C)
真 OO无双 · 2011-10-27 · via 博客园 - 真 OO无双

Abstract
通常公司為了保護其智慧財產權,會自己定義檔案格式,其header區會定義每個byte各代表某項資訊,所以常常需要直接對binary檔的某byte直接進行讀取,且連續幾個byte表示某一數值資訊。

Introduction
使用環境:Windows XP SP3 + Visual C++ 6.0 SP6

將讀取wf.bin的0x04 byte處的連續4 byte值。

Method 1:使用char array

ReadNByte1.c / C

 1 /* 
2 (C) OOMusou 2011 http://oomusou.cnblogs.com
3
4 Filename : ReadNByte1.c
5 Compiler : Visual C++ 6.0
6 Description : how to get n-byte value with n-byte position?
7 Release : oct.27,2011 1.0
8 */
9
10 #include <stdio.h>
11
12 int main() {
13 FILE *fp;
14 fpos_t pos;
15 unsigned char buff[4];
16
17 fp = fopen("./wf.bin", "rb");
18 if (!fp)
19 return 1;
20
21 pos = 0x04;
22 fsetpos(fp, &pos);
23
24 fread(buff, sizeof(char), 4, fp);
25
26 printf("0x%02x\n", buff[0]);
27 printf("0x%02x\n", buff[1]);
28 printf("0x%02x\n", buff[2]);
29 printf("0x%02x\n", buff[3]);
30
31 return 0;
32 }

24行

fread(buff, sizeof(char), 4, fp);

使用fread將4 byte讀進char array,因為單位是char,所以要讀進4個char。

Method 2:使用unsigned int

ReadNByte2.c / C

 1 /* 
2 (C) OOMusou 2011 http://oomusou.cnblogs.com
3
4 Filename : ReadNByte2.c
5 Compiler : Visual C++ 6.0
6 Description : how to get n-byte value with n-byte position?
7 Release : oct.27,2011 1.0
8 */
9
10 #include <stdio.h>
11
12 int main() {
13 FILE *fp;
14 fpos_t pos;
15 unsigned int buff;
16
17 fp = fopen("./wf.bin", "rb");
18 if (!fp)
19 return 1;
20
21 pos = 0x04;
22 fsetpos(fp, &pos);
23
24 fread(&buff, sizeof(unsigned int), 1, fp);
25 printf("0x%08x\n", buff);
26
27 return 0;
28 }

24行

fread(&buff, sizeof(unsigned int), 1, fp);

使用fread將4 byte讀進unsigned int,因為unsigned int已經是4 byte,所以只需讀進1個unsigned int即可。

實務上這種方式的應用較多。

完整程式碼下載
ReadNByte.7z

Conclusion
本文皆使用fsetpos(),史實上也可使用fseek(),請參考(筆記) 如何讀取binary file某個byte的值? (C/C++) (C)

See Also
(筆記) 如何讀取binary file某個byte的值? (C/C++) (C)