| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Windows関連 Solaris関連 画像入出力 その他アルゴリズムなど |
bootfont.binファイルの形式
はじめに
![]()
記録されている内容
ヘッダ
半角文字
全角文字
プログラム
#include <stdio.h>
#include <stdlib.h>
// 半角文字の1文字分の情報を保持する
typedef struct tagChr8
{
char n; // 文字コード
char c[16]; // 形状
} CHR8;
// 全角文字の1文字分の情報を保持する
typedef struct tagChr16
{
short n; // 文字コード
short c[16]; // 形状
} CHR16;
// 半角文字を1文字分表示する
void p8( CHR8 *c )
{
int i;
int j;
printf ( "CharNum = 0x%02X\n", c->n );
for ( i = 0; i < 16; i++ ) {
for( j = 0; j < 8; j++ )
printf( "%s", ( c->c[i] << j ) & 0x80 ? "■" : " " );
printf( " : 0x%02X\n", c->c[i] );
}
}
// 全角文字を1文字分表示する
void p16( CHR16 *c )
{
int i;
int j;
printf ( "CharNum = 0x%08X\n", c->n );
for ( i = 0; i < 16; i++ ) {
for( j = 0; j < 16; j++ )
printf( "%s", ( c->c[i] << j ) & 0x8000 ? "■" : " " );
printf( " : 0x%04X\n", c->c[i] );
}
}
int main()
{
int i;
int j;
unsigned int c;
CHR8 v8[256]; // 半角文字の情報を保持する領域
CHR16 *v16;
FILE *infile;
// ファイルを開く
infile = fopen( "c:\\bootfont.bin", "rb" );
// 全角文字の情報を保持する領域を確保する
v16 = (CHR16*)calloc( sizeof( CHR16 ), 65536 );
// 52バイトのヘッダを読み飛ばす
for ( i = 0; i < 52 && !feof( infile ); i++ )
getc( infile );
// 190文字の半角文字を入力する
for ( i = 0; i < 190 && !feof( infile ); i++ ) {
// 文字コード(1バイト)を取得
c = getc( infile );
v8[c].n = c;
// 文字の形状(8バイト)を取得
for ( j = 0; j < 16 && !feof( infile ); j++ )
v8[c].c[j] = getc( infile );
}
// ファイルの終端まで、全角文字の情報を取得する
for ( i = 0; i < 65536 && !feof( infile ); i++ ) {
// 文字コード(2バイト)を取得
c = getc( infile );
c = ( c << 8 ) + getc( infile ); // リトルエンディアンのため
if ( c < 65536 ) {
v16[c].n = c;
// 32バイトの文字の形状を取得
for ( j = 0; j < 16 && !feof( infile ); j++ ) {
v16[c].c[j] = getc( infile );
v16[c].c[j] = ( v16[c].c[j] << 8 ) + getc( infile );
}
}
}
// ファイルを閉じる
fclose ( infile );
c = getchar();
while ( EOF != c ) {
if ( c >= 0x81 && c <= 0x9F || c >= 0xE0 && c <= 0xEF ) {
// 全角文字
c = ( c << 8 ) + getchar();
p16( &(v16[ c ]) );
}
else {
// 半角文字
p8( &(v8[ c ]) );
}
c = getchar();
}
return 0;
}
Option Explicit
' 半角文字の情報を保持する
Public Type CHR8
n As Long
c(16) As Long
End Type
' 全角文字の情報を保持する
Public Type CHR16
n As Long
c(16) As Long
End Type
' 半角文字の出力用の文字列を合成する
Public Function p8(ByRef r As CHR8) As String
Dim i As Long
Dim j As Long
p8 = "CharNum = &H" + Hex(r.n) + vbCrLf
For i = 0 To 15
' 上位ビットから順に1か0かを判定する
For j = 0 To 7
If (r.c(i) * (2 ^ j)) And &H80 Then
p8 = p8 + "■"
Else
p8 = p8 + "□"
End If
Next
p8 = p8 + " : &H" + Hex(r.c(i)) + vbCrLf
Next
End Function
' 全角文字の出力用の文字列を合成する
Public Function p16(ByRef r As CHR16) As String
Dim i As Long
Dim j As Long
p16 = "CharNum = &H" + Hex(r.n) + vbCrLf
For i = 0 To 15
' 上位ビットから順に1か0かを判定する
For j = 0 To 15
If (r.c(i) * (2 ^ j)) And Abs(CLng(&H8000)) Then
p16 = p16 + "■"
Else
p16 = p16 + "□"
End If
Next
p16 = p16 + " : &H" + Hex(r.c(i)) + vbCrLf
Next
End Function
Public Sub main()
Dim v8(256) As CHR8
Dim v16(65535) As CHR16
Dim c As Long
Dim i As Long
Dim j As Long
Dim s1 As String
Dim s2 As String
Open "c:\bootfont.bin" For Binary Access Read As #1
c = AscB(InputB$(52, #1)) ' 52バイトのヘッダを読み飛ばす
' 半角文字(190文字)の情報を取得
i = 0
While Loc(1) < LOF(1) And i < 190
c = AscB(InputB$(1, #1)) ' 文字コードを取得
v8(c).n = c
' 形状のデータを取得
For j = 0 To 15
v8(c).c(j) = AscB(InputB$(1, #1))
Next
i = i + 1
Wend
' 全角文字の情報を取得
While Loc(1) < LOF(1)
c = AscB(InputB$(1, #1)) ' 文字コードを取得
c = c * 256 + AscB(InputB$(1, #1))
v16(c).n = c
' 形状のデータを取得
For j = 0 To 15
v16(c).c(j) = AscB(InputB$(1, #1))
v16(c).c(j) = v16(c).c(j) * 256 + AscB(InputB$(1, #1))
Next
Wend
Close #1
s1 = InputBox("文字列") ' 変換対象の文字列を取得
s1 = StrConv(s1, vbFromUnicode) ' UnicodeをShiftJISに変換する
i = 1
While i <= LenB(s1)
c = AscB(MidB$(s1, i, 1))
' 全角文字か半角文字かを判定する
If c >= &H81 And c <= &H9F Or c >= &HE0 And c <= &HEF Then
' 全角文字
i = i + 1
c = c * 256 + AscB(MidB$(s1, i, 1))
Debug.Print p16(v16(c))
Else
' 半角文字
Debug.Print p8(v8(c))
End If
i = i + 1
Wend
End Sub
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||