找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 9541|回复: 1

4KBytes Bin File Editor

[复制链接]
发表于 2009-5-18 13:49:09 | 显示全部楼层 |阅读模式
4KBytes Bin File Editor
0 N& z: R! |# ?7 F2 h6 m: T
7 O* d, ^! r2 Q4 g" |) w) [9 B" N

& u0 S0 L/ F7 x& T+ a  r前一段时间code base将常量独立出来统一放到一个4Kbytes的二进制文件中,这样就隔离了变化,降低代码维护,修改的负担了。以往的做法这些常量都散落在代码之中,一旦有需求变更就要搜索这些变更的部分到处改代码,经常会漏改某一些地方后面测试就会出bugL.新的做法就可以有效的避免上述情况了,通过一个4Kbytes的文件将它们统一起来,一旦有变化重新combine一次就OK
  t0 o* |; b: I3 E
$ t& S0 `8 `/ w+ T( R
想法非常好,可是我们很长一段时间都没有收到好用的工具可以直观的方便的编辑这个4Kbyte的二进制文件,于是我就写了这样一个EC4KTool.exe。后续几个月我都用这个tool编辑非常爽!可是后来公司release出了一个正式的工具,我的这个tool就退出历史的舞台了,程序运行如下图1所示:

' W0 r$ D3 Z8 c/ O& M+ d( X) a3 u1 g; p) \. W; o
( \+ s, l0 ]) D/ w1 Z" I

+ q  ~6 X2 p, s) ~( ]6 B( x( V7 r 1
* M/ E: D: F/ z
为了发挥它的余热我现在将完整的source code贴在附件,供需要写二进制编辑工具的朋友参考。EC4KTool.exe其实非常简单,只不过是读写文件而已,代码中比较有趣的部分在于我使用了一个singleton BinFileOps管理文件的读入,分析,保存的动作如下述代码所示:
+ N" |5 q4 p9 x! I5 G" @) ~# Q% w1 j% D
. f" E% O$ Q) T0 A/ d) [- D, U* z
#pragma once
: B% d/ s, U9 j8 i2 M8 @#include "BinFileDef.h"
5 {# L* `3 X9 y; q0 P  `9 N8 d* r6 U9 L$ @1 {' l/ N& z
class BinFileOps& O8 R4 g- m; J, j& y' w% @. A, Y
{
, \" `5 N  ?9 B' T0 n1 e+ _private:9 N7 E- V5 t) P% O( N/ o0 i
& W. a, n% S1 w# m
BinFileOps(
void);
5 M7 B' F& D) u7 _7 r/ q

5 G6 f: o6 Z- M( ]~BinFileOps(
void);

$ ?9 J' k6 [4 I' a1 \9 d# D$ J
2 b" v3 E( y/ a( |4 rpublic:, c6 M. W+ J  \$ I/ I: S

3 Y1 u: I2 g& v/ _        static BinFileOps* get_instance();
; u) O: ]8 l, K& n        void set_4k_filepath(CString& str);
7 ]3 A# y8 n+ Z# y: [: q- v4 E# }        void load_default_4k();  i4 C: t) }% m& q
        void save_to_4k();
* x$ h/ z7 _& z# ?( n+ g
+ O- F1 q' U' b% p/ n/ p3 U% aBOOL validate_file();
+ ~* P3 P3 l9 Z/ F: Q# C
  f3 K: W, R$ W5 Z. J) O8 Z
public:
" r  X+ {/ O; x0 W- n, }6 k6 @4 n* c. I- o) P1 f3 h
4 _2 r+ c0 L: I. C
Ec_Project_Info m_Ver;

3 S* f: F0 r6 T' G+ l) d$ S  m" |9 w- D
Ec_Key
( v1 e. Z! n% `* A# t- `m_Key;

6 v; C' U. U6 J5 K+ l) ~
! a2 M' m- d, k" v& iEc_Power m_Pwr;

. H9 W3 q/ [) i, s4 O$ w% F* ?
4 h; x; b+ g* T" hEc_Brightness m_Brg;

" z/ o( @% M( h0 |4 I; |  L" E
' I: Z$ F# c1 b7 [4 S, H4 Z" zEc_Thermal m_Thermal;
! Z, U* V4 S+ _1 s

* w9 F+ D; h/ f7 h0 f1 @& b, Q" XEc_IKB m_Ikb;

. s8 E9 X3 B4 f5 J1 i3 L
8 S  M: r. s' B& B6 j# s% K+ M% uEc_Hotkey_Index m_Hotkey_Tab;
! ~& z/ R2 \( j  t$ {1 _' P0 }

6 {5 n+ A# e8 K+ P# rEc_Batt_Info( x7 {4 `6 ]) ]+ i
m_Batt_Info;
2 ]) A( n8 D1 a; ]  {4 G3 x! A2 |
' ~' A4 G" M' Q/ P
Ec_HotKey_Value m_Hot_Val;
7 q- Z! A5 a% O/ s' L9 [

; @5 T/ [0 y& m, u9 jprivate:
1 e8 {& R& [$ f  i8 Z, x) ^7 }3 t: S

9 S2 |. o% e: Q& aCString m_File_Path;

& N( f; o$ |8 e0 T
/ v% c) z' i2 Q$ Mpublic:
; M- L; a# u1 Y0 G
: p- b0 K% ^9 U8 q3 G$ C6 X' p/ q
$ H* ]8 E2 K& MPCHAR WideStr_To_MultiStr (PWCHAR WideStr);

/ d! e; T7 d$ S& D0 J2 n$ ]( I' W0 Z2 t
};* b; ?; R& B( K3 |5 {3 f
另一个有趣的地方就是broadcast,因为每张table都对应一个dialog,所以该程序会有很多的dialog。在读入文件完成,或者需要写入文件时我都会广播通知所有的dialog告知数据已经读入而且分析完成,请更新显示;或者要将修改的数据写入二进制文件了,请将dialog中的数据都摘下来。代码如下所示:
8 s( C0 \& q& w1 l3 L+ `7 Lvoid CMyTabCtrl::broadcast_read_4k()1 H6 Z: d: K* \: m, C. P0 }+ V+ a
{
1 X- _( B  e- `( |! F6 t- ^( [/ }! I& n* c# K% u/ E) N
        for(int nCount=0; nCount < m_nNumberOfPages; nCount++)
1 c. t/ u6 m# |! I$ S& m# {0 W
8 V  _& r" G5 K4 d{

% ], ]7 ^& l: o/ U4 \9 M7 x9 a9 W3 {9 G; S! f
: j8 k# K- s8 u+ l- A) g: c! Q/ E
::PostMessage(m_tabPages[nCount]->m_hWnd,WM_READ_4K,NULL,NULL);
/ F0 q4 _1 w  i, s' ]& [6 k  P) \

7 p# `& n# c; ]: y8 X}
% u# K% ?" t# Q$ t5 i) s

9 {1 _0 _- h) w" P}* q# i+ u" J5 ^2 c
9 i/ A- f$ n. d- q, Q4 j
void CMyTabCtrl::broadcast_write_4k()$ `4 D) X! g. Q+ }* B9 ]% X7 p
{# D) s& A4 j3 H" f% a$ h6 ~. _
        for(int nCount=0; nCount < m_nNumberOfPages; nCount++)
, {8 O4 Y  z8 p
; T) [9 o6 _3 {. P& C4 w5 d{
/ h5 U. a/ B0 |( \. T

& ]$ v+ `+ U' x/ J5 X* d::SendMessage(m_tabPages[nCount]->m_hWnd,WM_WRITE_4K,NULL,NULL);
; B6 x# ?% e) k4 }. b# \+ L; [
/ a# J+ a7 e+ N6 J1 q
}
) k; z- W4 B7 a1 Z$ i& \
}
/ D8 H1 ?* {5 d# }, v( y每个dialog收到broadcast message以后都会做更新显示或者摘出数据的动作如下述代码所示:
) L1 O$ N3 K1 i+ `% J& h6 O2 K0 M! K
( E7 T; c7 b' E- ]5 Z. Y& r7 _  _# fLRESULT CBrightnessDlg::OnRead4k(WPARAM wParam, LPARAM lParam)

' |3 O7 s% u4 s0 v! I* J1 g0 K
2 \4 o5 {( ]8 \, G% q) n{
6 r8 m2 N( y$ w4 w' }' F

; v5 ~( L9 J4 ?. }7 T( d5 q7 o: X8 S6 Q7 B0 I" ^1 n2 v9 `
BinFileOps* ptr_bin = BinFileOps::get_instance();
# ?* [. U  _& J% |( ?+ h. |8 p! T
# z2 ~2 @# z/ V

  a/ l* m. v  W8 ~. H# f* }$ K        for(int row = 1; row < m_Grid.GetRowCount(); row++)) Y: B: T$ T0 a4 S. Z
                for(int col = 1; col < m_Grid.GetColumnCount(); col++)
9 m; {5 l5 k- H9 S" J2 @" p+ ~  f- V# q7 v
{
6 p; ]7 h! U8 ?0 F

, d+ G7 Y& W* p, I: z* r; XGV_ITEM item;
! U7 N: t# Z' u

2 [0 O2 T: R8 v2 m  [item.mask = GVIF_TEXT|GVIF_FORMAT;
, ~3 B0 c( n1 n1 I$ }

, I6 Z, h! o7 K/ [2 p" ^item.row = row;
6 W0 n5 l; S+ A/ @* p- y1 |
* ^) f# O* d  h
item.col = col;

, W1 @5 h; ~. @! l; N. V/ {. D6 i  h' c7 n+ S3 F0 U
item.nFormat ==. j) A( [3 r/ G/ h( [
DT_CENTER|DT_WORDBREAK;
* |" f7 q9 w$ y; s$ _, y: K( {( H
                        char vtmp = *((char*)(&ptr_bin->m_Brg)+(row-1));' c, Q3 M1 f( r. n5 [. l" A

8 N3 f% a( n! |7 f- o" Citem.strText.Format(_T(
"%.2x"),vtmp);
* E3 k3 i: ^# |! R0 E
& \, ^- y, w% v
m_Grid.SetItem(&item);

9 B" M. S8 u7 |  c2 j* ?1 b
/ h  n2 N$ K* T1 v9 q+ {}

# A; T$ W. i* S4 ?6 Q- f! _! p
/ _% N2 x' ]- C" p+ }m_Grid.Invalidate();
7 B5 }& C, B/ s* H" C
        return 1;! Z' r" I" d2 K* y2 A
}/ ?& ?: h* x+ r  n

" e6 T  n' q8 t2 RLRESULT CBrightnessDlg::OnWrite4k(WPARAM wParam, LPARAM lParam)
6 ^9 F% H7 j% C' I4 s% ^) F{. D0 `5 d' x0 T- @+ \- v2 W

: q6 u6 \  _( E+ FBinFileOps* ptr_bin = BinFileOps::get_instance();

# V& ^! _/ y- Z. h  k" \' Q1 Y$ m# M" }' k6 r
2 z- f& y( \( h5 ^" ~
        for(int row = 1; row < m_Grid.GetRowCount(); row++). G; ?9 ?+ ?9 b$ U- {5 h: w( R2 H, g* e
                for(int col = 1; col < m_Grid.GetColumnCount(); col++)
: Q9 v9 e, ]( T4 S* N* s- l; p# L( f$ t: z) V( u
{

4 O- ^( S6 e( R! T: a# f3 ^  Z# E( G& m* F: }
CString str = m_Grid.GetItemText(row,col);
. h3 {" H$ z2 x- Y4 m- j( G" H

9 D, M3 C3 C& r& d7 ^; w$ h. q, `PCHAR tmp = ptr_bin->WideStr_To_MultiStr(str.GetBuffer());
1 Y5 Z5 v9 U; E2 W% [3 q# `# X0 M' C5 D
                        int ndata;
. i1 \+ q6 Y1 [
2 `; N, I( u! a, Xsscanf(tmp,
"%x",&ndata);
5 j1 }3 y6 p4 t3 T

. k" ?8 q+ I% Z6 c*((
unsigned char*)(&ptr_bin->m_Brg)+(row-1)) = ndata;
) L) \: L9 y! c+ F9 }- t% c6 v
2 k3 z5 J! {) c! j( d. c1 X
}

% l7 \3 F' W. y+ |5 F9 N2 g+ x        return 1;  K4 @* D4 M' X, F! p/ l0 H# Y
}
5 Q  w' T$ L  v1 n3 s( n* Q+ d) a2 e另外有没有发现EC4KTool.exe 界面部分风格有点像vista(半透明,淡蓝色)J。如果对你有所帮助,要谢谢我哦J; A$ A8 ]/ O  {: I8 b8 f2 u# c
) n8 I. K7 C" ]. g
That’s all!
5 A6 ]) x& u' B; {) L, z' K/ b/ ?5 }  c7 M$ m9 ?+ K/ |
Peter

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入计匠网

×
发表于 2009-7-9 22:04:34 | 显示全部楼层
没看懂,不过感觉的确是好贴!/ r: k, F0 A0 K+ |0 |
LZ的开源精神值得学习呀,尤其是自己开发和整理的,先谢谢了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-5-16 06:53 , Processed in 0.045733 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表