SyntaxHighlighter

2013-06-29

台湾戸籍謄本の日本語訳

日本で結婚するときに、台湾の戸籍謄本の訳本が要る。
検索したら、いろいろ有用な先人たちの情報があります。



んで、一応訳してみました。
これで大丈夫でしょう(自称)

2013-06-20

Free 2D CAD - DraftSight

如果你像我一樣想找個免費的好用CAD
可以相容AutoCAD,開圖又不會跑掉
那你可以試試DraftSight

DraftSight是有名的3D CAD公司Dassault Systemes開發的免費2D CAD軟體。
同一家公司也出過有名的Solidworks以及CATIA。

DraftSight相容於AutoCAD,介面也跟AutoCAD非常的類似,熟悉AutoCAD的朋友應該馬上就可以上手。同時,他也公開了Windows/Mac/Linux等不同平台上的包裝,跨平台的幫助下,其實有機會可以建立一個完全免費的CAD環境(Ubuntu + DraftSight)

下載網址如下:
(日文版) http://www.3ds.com/jp/products/draftsight/free-cad-software/
(簡中版) http://www.3ds.com/cn/products/draftsight/download-draftsight/

* 免費只限於獨立版本,每年需要登記(但登記也是免費的!!)
** 撰寫時,版本編號V1R3.1

2013-06-18

Online LaTeX Equation Editor

這幾天為了打出好看的數學/化學方程式而煩惱...
做出來的東西是要放在網頁上,而不是要放在Word裡面(在Office裡面的話就直接用內建的方程式編輯器就好啦),偏偏公司的電腦又不給灌OOo(不然我就可以用OOo的方程式編輯器存成png檔了)

找了半天,原來有線上轉換器XD

基本上原理就是運用後台的LaTeX解析器轉換TeX文法,然後將生成出來的方程式文件轉換成圖像檔讓我們可以抓下來用

Codecogs: Online Latex Equation Editor - create, integrate and download

HostMath: http://www.hostmath.com/

OK, 又解決一個問題

Enable Reference Extension for MediaWiki

在某些跟我一樣喜歡用MediaWiki形式撰寫內部資料的人來說,當你想要如同在Wikipedia裡面一樣用<ref>標籤來標示參考資料/腳註,你必須自己下載Cite外掛

安裝方法很簡單,
  1. 到Cite外掛的頁面,下載最新的安定版本
  2. 把內容解壓縮到你的MediaWiki目錄中的extensions\Cite
  3. 編輯你的MediaWiki目錄中的LocalSetting.php檔,加入下面語句:
    require_once("$IP/extensions/Cite/Cite.php");
使用的時候,加入下面的標籤到你的MediaWiki編輯頁(如果你有開啟進階編輯輔助器,就直接插入腳註就好XD)
<ref name="example">腳註內容</ref>

最後在參考文獻處打上<references /> ,MediaWiki就會自動把你之前打上的所有註解列在最後面囉。簡單吧XD

2013-06-09

3.5吋軟碟片FAT磁區解析-part 5. 資料區格式

本來應該是不需要寫到這裡的。但是實際上處理時遇上了一些問題,讓我寫在這裡吧。

第1個問題,EOF
當你分析整個sector,你會發現:要怎麼處理檔案結束(EOF)阿?
當讀取整個磁區時,它一定會是磁區的倍數(512的倍數)大小

但是,實際上一個檔案並不一定會佔滿整個磁區。或者說,很小的機率下檔案會是剛好一個磁區大小。

於是,還是需要讀到EOF來結束實際上的二次元檔案輸出

但是,EOF是C裡面的處理符號,當使用C#之類的語言的時候要怎麼處理呢?

答案是,讀到0x1A就是EOF!!

又但是...這個論點只限於處理文字檔案,不適合處理一般的binary檔案
那要怎麼決定檔案結束呢?

很簡單,記不記得在讀取根目錄結構的時候有個參數是"檔案大小"?
對,讀到應讀取的檔案大小之後就可以停止了。這樣就可以避免誤讀0x1A了

以上,結束 XD


3.5吋軟碟片FAT磁區解析-part.4 根目錄

位於根目錄區域和子目錄區域的目錄條目都是下面的格式:
位元組偏移長度描述
0x008DOS檔名(附加空格)
第一個位元組可以是下面的特殊數值:
0x00這個條目有用並且後面沒有被佔用條目
0x05最初字元確實是0xE5
0x2E'點'條目;'.'或者'..'
0xE5這個條目曾經被刪除不再有用。取消刪除檔案工具作為取消刪除的一步必須使用一個正常的字元取代它。
0x083DOS副檔名(空格補齊)
0x0b1檔案內容
第一個位元組可以是下面一些特殊值:
掩碼描述
00x01唯讀
10x02隱藏
20x04系統
30x08卷標
40x10子目錄
50x20檔案
60x40裝置(內部使用,磁碟上看不到)
70x80沒有使用

內容值0x0F用來表示長檔名條目。
0x0c1保留,NT使用(參見後面)
0x0d1建立時間,最小時間解析度:10ms單位,數值從0到199。
0x0e2建立時間。小時、分鐘和秒根據後面的圖示描述進行編碼:
描述
15-11小時(0-23)
10-5分鐘(0-59)
4-0秒/2(0-29)
注意只保存了2秒的解析度。更細解析度的檔案建立時間在偏移0x0d處。
0x102建立日期。年、月和日根據後面的圖示編碼:
描述
15-9年(0 = 1980, 127 = 2107)
8-5月(1 = 1月,12 = 12月)
4-0日(1 - 31)
0x122最近存取時間;參見偏移0x0e處的描述。
0x142FAT12和FAT16中的EA-Index(OS/2和NT使用),FAT32中第一個叢集的兩個高位元組
0x162最後更改時間;參見偏移0x0e處的描述。
0x182最後更改日期; 參見偏移0x10處的描述。
0x1a2FAT12和FAT16中的第一個叢集。FAT32中第一個叢集的兩個低位元組。
0x1c4檔案大小
長檔名(LFN)使用一個技巧儲存在FAT檔案系統上——在目錄表中添加假的條目。這些條目使用一個普通檔案無法使用的卷標內容標識,普通檔案無法使用是由於它們被大多數舊的MS-DOS程式忽略。很顯然,一個只包含卷標的目錄被當作空卷,這樣就允許刪除;使用長檔名建立的檔案在從普通的DOS刪除就會發生這樣的情形。

當是長檔名的時候,將會用下面表中的格式來登錄。

位元組偏移長度描述
0x001序列號
0x0110名稱字元(5個UTF-16字元)
0x0b1內容(永遠是0x0F)
0x0c1保留(永遠是0x00)
0x0d1DOS檔名校驗和
0x0e12名稱字元(6個UTF-16字元)
0x1a2第一個叢集(永遠是0x0000)
0x1c4名稱字元(兩個UTF-16字元)

最後須注意的是,舊型的系統因為不支援長檔名,所以通常讀到叢集數是0x0000的時候,就可以直接忽略掉它了


3.5吋軟碟片FAT磁區解析-part.3 檔案分割表

第三章 檔案分割表File Allocation Table (FAT)

基本上,在我整理的這一系列文章裡面,主要討論的目標是FAT12
為什麼叫FAT12呢?
對檔案系統有點認識的人,就知道除了FAT12之外,最常聽到的FAT格式就是FAT16跟FAT32

12/16/32是在說什麼呢?他是指一個FAT佔了多少位元(bit)
沒錯,你沒看錯,是位元而不是位元組
而大家都知道,一個位元組佔了8位元
也就是說,除了FAT12以外,其他的FAT都可以直接讀取/寫入整個位元組來確認磁區位置,只有FAT12這傢伙很難處理



在這裡,要先說明FAT格式下如何取得檔案內容
Step1. 前往根目錄磁區取得檔案的第一磁簇位置
Step2. 取得被標示在第一磁簇位置的二次元檔案內容
Step3. 前往FAT確認下一個磁簇位置
Step4. 取得下一個磁簇位置的二次元內容
Step5. 重覆Step3~4,直到下一個磁簇位置被標示為檔案結尾

由於FAT12用12bit來表示一個磁簇位置,所以通常一個磁簇的內容會是下表的其中一個內容
entry content說明
0x000空白
0x001內部用途保留。由於通常資料都是由第二磁簇開始的,應該是不會用到1號磁簇。
0x002-0xFEF下一個磁簇的位置
0xFF7損壞磁簇
0xFF8-0xFFF檔案結束
未列出的就是保留用的。


很好,你看到了Step3的地方要到FAT取得下一個磁簇位置。
我們調用某個磁碟的第一FAT的前32byte(16 Chars)如下
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
F0 FF FF 03 40 00 05 60 00 07 80 00 09 A0 00 0B
前12bit 它是0xf0 + 0xf。表示它是2HD的1440KiB的軟碟。12bit的餘下4bit通常會被填入1 第二組,必須是0xfff。
這裡,你想調用第二磁簇的位置,你看到了下一個byte。
什麼鬼?0x034?
喔,不對不對,它是0x003。因為一般的86機是little-endian,所以下面的byte要放到上面來。如果你用的程式剛好可以讀寫一個bit,那當然沒問題
問題在於,通常的程式都是一次讀寫一個byte,也就是說,你一定會讀到8的倍數的bit數
像是這個部分,你必須讀出六個byte分成上下兩部分,分別是0xff,0x0f跟0xf0,0xff
因為他們的bit剛好是 11111111 | 11110000 跟 00001111 | 11111111

...我寫到這裡已經很火大了,因為取得一個簇的時候要分成奇偶數
當是偶數的時候,起始byte位置(從0開始) = 想取得簇數cluster * 3 / 2
當是奇數的時候,起始byte位置(從0開始) = (想取得簇數cluster * 3 - 1) / 2

讀取的時候還好,只需要取得起始位置開始2byte, 然後依照奇偶數進行交集(AND)位元運算。
偶數時,0xff 0x0f
奇數時,0xf0 0xff

寫入的時候就痛苦了,必須先讀出原始位置中重覆的那一個byte,把原始的4bit寫進將要寫入的byte上,然後再寫回FAT表...
好慘...我要寫個慘字

3.5吋軟碟片FAT磁區解析-part.2 啟動磁區


第二章 啟動磁區Boot Sector

對於一般的2HD, 2DD來說、啟動磁區都佔有磁區的前512KiB
啟動磁區的大小,一般的5吋跟3.5吋都是512KiB,只有某些舊式的8吋磁碟會有其他的大小
所以基本上,先讀512KB進來分析就對了!!

雖然最近的系統裡都會定義這個部分,但是某些舊式的系統(像是MSX-DOS 1.0,還有MOTOMAN的軟碟片)會直接跳過這部分,而讀取FAT磁區的第一byte來確認磁碟格式。
當系統讀不出磁碟內容的時候,絕對是Boot Sector被跳過了!!

這512KiB中,資料依照以下內容排列:
Sector
Offset
磁區偏移
BPB
Offser
length
長度
說明
0x000 3 Jump instruction.
跳轉指令(跳過開頭一段區域)
0x003 8 OEM Name (padded with spaces 0x20).
OEM名稱(空白0x20補齊)
0x00B 0x00 2 Bytes per logical sector
磁區位元組數
0x00D 0x02 1 Logical sectors per cluster.
每叢集磁區數
0x00E 0x03 2 Reserved logical sectors
保留磁區數(包括啟動磁區)
0x010 0x05 1 Number of File Allocation Tables.
檔案分配表數目
0x011 0x06 2 Maximum number of FAT12 or FAT16 root directory entries.
根目錄磁區最大登錄數
0x013 0x08 2 Total logical sectors.
總磁區數.
0x015 0x0A 1 Media Descriptor
介質描述。常用0xF0: 2HD144, 0xF9: 2DD720, 0xFB: 2DD640
0x016 0x0B 2 Logical sectors per File Allocation Table for FAT12/FAT16.
每個檔案分配表的邏輯磁區數
0x018 0x0D 2 Physical sectors per track for disks with INT 13h CHS geometry.
磁軌磁區數
0x01A 0x0F 2 Number of heads for disks with INT 13h CHS geometry
磁頭數
0x01C 0x11 4 Count of hidden sectors preceding the partition that contains this FAT volume.
隱藏磁區數
0x020 0x15 4 Total logical sectors(FAT16)
總磁區數。當大於65535時(0xffff)。FAT12下是通常不會用到…
0x026 0x1B 1 Extended boot signature(0x29)
延伸啟動磁區記號。通常為0x29
0x027 0x1C 4 Volume ID(serial number)
磁碟ID。"xxxx-xxxx"  通常是系統時間與系統日期的綜合。至於位元組內容可以參考根目錄磁區的檔案時間與日期
0x02B 0x20 11 Partition Volume Label, padded with blanks(0x20).
分割區標籤。
0x036 0x2B 8 File system type, padded with blanks(0x20).
檔案系統格式。e.g., "FAT12   ","FAT16   ", "FAT     "
0x1FE 2 Boot sector signature (0x55 0xAA)
磁區結束符

為了快速查詢各種參數,請看下面的表(出自英文版的Wikipedia。中文翻譯則以中文維基百科為主)
Media Descriptor
界質描述
0xF0 0xF9 0xFA 0xFB 0xFC 0xFD 0xFE 0xFF
DISC Size
物理磁碟尺寸
3.5" 5.25" 3.5" 3.5"
5.25"
3.5"
5.25"
5.25" 5.25" 5.25" 5.25"
Density
磁碟密度
HD HD DD DD DD DD DD
Modulation
調變
MFM MFM MFM MFM MFM MFM MFM MFM MFM
Formatted Capacity(KiB)
格式化磁碟容量
1440 1200 720 320 640 180 360 160 320
Cylinders(CHS)
磁柱數
80 80 80 80 80 40 40 40 40
Physical sertors/track
磁軌磁區數[0x18]
18 15 9 8 8 9 9 8 8
Number of heads
磁頭數[0x1A]
2 2 2 1 2 1 2 1 2
Bytes/Logical sector
邏輯磁區位元組數[0x0B]
512 512 512 512 512 512 512 512 512
Logical sectors/cluster
每個簇的邏輯磁區數[0x0D]
1 1 2 1 2 1 2 1 2
Reserved Logical Sectors
保留磁區數[0x0E]
1 1 1(2) 1 1 1 1 1 1
Number of FATs
FAT數[0x10]
2 2 2 2 2 2 2 2 2
Root directory entries
根目錄條目數[0x11]
224 224 112 64 112 64 112 64 112
Total logical sectors
總磁區數
2880 2400 1440 640 1280 360 720 320 640
logical sectors/FAT
FAT磁區數
9 7 3 2 2 2 2 1 1
Hidden sectors
隱藏磁區數
0 0 0 0 0 0 0 0 0

2013-06-08

3.5吋軟碟片FAT磁區解析-part.1 磁碟結構

前言

因為XP以後的作業系統把1.44MiB 3.5吋軟碟以外的支援拿掉了
於是其他格式的舊磁片的內容就不能備份到一般電腦內
換句話說,在一般的電腦裡就不能編修軟碟內容...這東西非常棘手

對於某些舊式MC以及機器人(像是MOTOMAN),沒有了新式周圍機器的支援,他們只會輸出2DD型式的內容,於是XP讀不出來他們的內容(對,很機車)。
另外,對於某些舊式的程式來說,他們不會輸出Boot Sector,所以就算裡面資料是正確的,在一般的磁碟分析工具裡面也是讀不出他們的內容的(這點可以用暴力法強迫讀出...請參照FAT一章)

雖然說套用工具去直接控制BIOS可以讓我們直接對磁碟片進行HARD-COPY(就是說完整copy磁片內容,包括所有有用/無用的磁區),但是其實我們還是想看看程式內容寫了些什麼,這樣我們才能分析自己的程式到底跑了些什麼內容。

以下提供主要的三種類3.5吋磁片的內容分析

  1. 2HD, 1.44MiB
  2. 2DD, 720KiB
  3. 2DD, 640KiB

其他的磁片種類,請看英文Wikipedia FAT12的分析(非常詳細,只是很難看懂)

第一章:磁碟結構


要寫的東西有點多,我就簡單的整理一下就好

一般的FAT12/16格式,磁碟結構內容都是照下面的順序排列

名稱英文磁區大小(sector數)
啟動磁區Boot Sector保留sector大小。一般是512KB(1 sector)
檔案分配表#1File Allocation Table #1FAT磁區大小
檔案分配表#2File Allocation Table #2FAT磁區大小
根目錄Directory table(根目錄保存檔案上限*32)/(Sector Byte數)
資料區Data Region剩餘磁區


2013-06-05

Call Win32 DLL from C#

參考網址:

Win32 APIやDLL関数を呼び出すには? - http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html

C# Win32 API および DLL の利用
http://typea.info/tips/wiki.cgi?page=C%23+Win32+API+%A4%AA%A4%E8%A4%D3+DLL+%A4%CE%CD%F8%CD%D1

[C#] 使用 Win32 API 來進行控制其他程式視窗行為表現
http://www.dotblogs.com.tw/nobel12/archive/2009/10/05/10915.aspx

(筆記) 如何使用C#使用Win32 DLL? (.NET) (C#) (Windows Form)
http://www.cnblogs.com/oomusou/archive/2011/02/13/cs_pinvoke.html

Floppy Raw Read Driver for Windows


fdrawcmd.sys

請到下面網址抓取相關工具
http://simonowen.com/fdrawcmd/


有了Driver,你也可以順便抓取其他工具來讀寫資料
推薦下面兩個:


SAMdisk - http://simonowen.com/samdisk/
跟上面的驅動是同一個作者,簡單的讀寫還沒問題,至於想要看讀寫出來的東西的內容...還是看下面另一個吧


HxC Floppy Emulator - http://hxc2001.free.fr/floppy_drive_emulator/
這傢伙可強大了,不止可以讀寫磁碟機,還可以幫你搞定裡面的檔案內容
但是有點小問題...他不會幫你搞定Boot Sector
所以原始磁碟的Boot Sector沒有資料但是其實裡面有東西的時候...
自己做個同樣大小的假磁碟然後把Boot Sector拷貝過去,那東西就讀的出來了XD

2013-06-04

ASCII String/Char to Byte

String -> Byte

string sTest = "TEST"
byte[] bTest = Encoding.ASCII.GetBytes(sTest);


Char -> Byte

Char cTest = 'A'
byte bTest = Convert.toByte(cTest);


Convert BitArray to Byte

byte ConvertToByte(BitArray bits) 
{
	if (bits.Count != 8) { throw new ArgumentException("bits"); }     
	byte[] bytes = new byte[1];     
	bits.CopyTo(bytes, 0);     
	return bytes[0]; 
}

[C#]string,char,byteの相互変換


文字を表現する各種データ型の変換方法です。
Stringから他の型に変換する場合は、文字コードの指定が必要となります。

string -> char

string str = "hello world";
 
//文字列をcharの配列に変換する
char[] charArray = str.ToCharArray();
 
//文字列を、1文字づつcharとして処理する
foreach (char c in str) {
    Console.WriteLine( c );
}
 
//文字列のn文字目をcharとして取得する
int n = 5;
char c = str[n];


char -> string

char c = "あ";
string s = c.ToString();


string -> byte

byte[] bytesArray = xxx;
 
// SJISのbyte配列をstringに変換
str = System.Text.Encoding.GetEncoding( 932 ).GetString( bytesArray );
 
// UTF-8のbyte配列をstringに変換
str = System.Text.Encoding.UTF8.GetString( bytesArray );



byte -> string

string str = "hello world";
byte[] bytesArray;
 
// stringをSJISのbyte配列に変換
byte[] bytesArray = System.Text.Encoding.GetEncoding( 932 ).GetBytes( str );
 
// stringをUTF-8のbyte配列に変換
byte[] bytesArray = System.Text.Encoding.UTF8.GetBytes( str );



byte -> char

byte[] bytesArray = ...;
char[] charArray  = System.Text.Encoding.GetEncoding( 932 ).GetString( bytesArray ).ToCharArray();



char -> byte

char c = "あ";
byte b = Convert.ToByte( c );

人気の投稿