TNB Library
TnbDump.h
[詳解]
1#pragma once
11#include "TnbStrVector.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
34//template<typename TYP>
35inline CStrVector DumpData(size_t size, const void* pData, bool canAllDump = true, size_t width = 16, bool isUnicode = false)
36{
37 CStrVector sa;
38 if ( width < 2 )
39 {
40 width = 2;
41 }
42 size_t bufferLength = (21 + width * 3 + width + 8);
43 CWorkMemT<TCHAR> buffer(bufferLength);
44 LPTSTR lpszBuffer = buffer.Ref();
45 const BYTE* B = reinterpret_cast<const BYTE*>(pData);
46 bool isLastSecondByte = false;
47 for ( size_t j = 0; j < size; j += width )
48 {
50 sf.Initialize(lpszBuffer, bufferLength);
51 sf.AddFormatHexInt(down_cast<DWORD>(j), 4);
52 sf.AddLiteral(_T(" : "));
53 loop ( i, width )
54 {
55 if ( i + j >= size )
56 {
57 sf.AddLiteral(_T("-- "));
58 }
59 else
60 {
61 BYTE c = B[i + j];
62 sf.AddFormatHexInt(c, 2);
63 sf.AddChar(' ');
64 }
65 }
66 sf.AddLiteral(_T(" : "));
67 if ( ! isUnicode )
68 {
69 //== S-JIS
70 loop ( i, width )
71 {
72 if ( i + j >= size )
73 {
74 break;
75 }
76 TCHAR c = B[i + j];
77 if ( isLastSecondByte )
78 {
79 isLastSecondByte = false;
80 sf.AddChar('.');
81 }
82 else if ( c >= 0 && c < 0x20 )
83 {
84 sf.AddChar('.');
85 }
86 else if ( i == (width - 1) && STRLIB::GetCharSize(c) == 2 )
87 {
88 if ( (i + j + 1) < size )
89 {
90 sf.AddChar(c);
91 sf.AddChar(B[i + j + 1]);
92 isLastSecondByte = true;
93 }
94 else
95 {
96 sf.AddChar('.');
97 }
98 }
99 else
100 {
101 sf.AddChar(c);
102 }
103 }
104 sf.AddTerminateChar();
105 sa.Add(CStr(sf));
106 }
107 else
108 {
109 //== UNICODE
110 CUnicode uni;
111 size_t i = width;
112 if ( i + j >= size )
113 {
114 i = size - j;
115 }
116 uni.SetFromLeft(reinterpret_cast<LPCWSTR>(&B[j]), i / 2);
117 sf.AddTerminateChar();
118 sa.Add(CStr(CUnicode(sf) + uni));
119 }
120 //
121 if ( ! canAllDump )
122 {
123 if ( j >= width * 4 )
124 {
125 isLastSecondByte = false;
126 canAllDump = true;
127 size_t k = (size - width * 4) & 0xFFFFFFF0;
128 if ( j < k )
129 {
130 sa.Add(_T(" : :"));
131 j = k;
132 }
133 }
134 }
135 }
136 return sa;
137}
138
139
140
153inline void DebugDump(size_t size, const void* pData, bool canAllDump = false, size_t width = 16, bool isUnicode = false)
154{
155 bool r = true;
156 #if defined(_DEBUG) && ! defined(_WIN32_WCE)
157 #if ( _WIN32_WINNT >= 0x0400 ) || ( _WIN32_WINDOWS > 0x0400 )
158 #define _DEBUGDUMP_ENABLE
159 r = !! ::IsDebuggerPresent();
160 #endif
161 #endif
162 #if defined(_DEBUG) && defined(_WIN32_WCE)
163 #define _DEBUGDUMP_ENABLE
164 #endif
165 //
166 #ifdef _DEBUGDUMP_ENABLE
167 if ( r )
168 {
169 ::OutputDebugString(CStr::Fmt(_T(">Size = %u\n"), size));
170 CStrVector sa = DumpData(size, pData, canAllDump, width, isUnicode);
171 loop ( i, sa.GetSize() )
172 {
173 ::OutputDebugString(_T(" ") + sa[i] + _T("\n"));
174 }
175 }
176 #endif
178}
179
180
181
182}; // TNB
183
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
文字列情報配列管理関係のヘッダ
簡易文字列書式関係のヘッダ
文字列管理テンプレート
Definition: TnbStr.h:74
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
CStrT & SetFromLeft(const TYP *lpText, size_t iLen)
[代入] 文字数制限代入.
Definition: TnbStr.h:278
void Initialize(TYP *_P, size_t len)
[設定] 初期化.
void AddChar(TCHAR c)
[追加] 一文字追加.
void AddTerminateChar(void)
[追加] 終端文字追加.
void AddLiteral(const XX &literal)
[追加] 文字列リテラル追加.
void AddFormatHexInt(DWORD value, size_t width)
[追加] DWORD 型 HEX 追加.
簡易文字列書式.
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
const TYP * Ref(void) const
[取得] ポインタ取得
Definition: TnbDef.h:712
CStrVector DumpData(size_t size, const void *pData, bool canAllDump=true, size_t width=16, bool isUnicode=false)
[作成] バイナリダンプ用文字配列作成.
Definition: TnbDump.h:35
void DebugDump(size_t size, const void *pData, bool canAllDump=false, size_t width=16, bool isUnicode=false)
[作成] バイナリダンプ.
Definition: TnbDump.h:153
int GetCharSize(char c)
[取得] 文字のサイズ(ASCII/SJIS用)
Definition: TnbStrLib.h:341
TNB::CStrT< WCHAR > CUnicode
UNICODE文字列クラス
Definition: TnbStr.h:1771
TNB::CStrT< TCHAR > CStr
文字列クラス
Definition: TnbStr.h:1785
void IgnoreUnusedValue(const T &value)
[宣言] 参照しない値宣言.
Definition: TnbDef.h:434
TNB Library
Definition: TnbDoxyTitle.txt:2