8 番外篇
標(biāo)題很奇怪?其實(shí),您可以把它當(dāng)作一期OVA。
8.1 批量十六進(jìn)制二進(jìn)制格式轉(zhuǎn)換
想把數(shù)據(jù)(流)以十六進(jìn)制或二進(jìn)制的形式顯示出來?UltraEdit之類的編輯軟件一定是首選。即使是要自己親自轉(zhuǎn)出來,C/C++等語(yǔ)言也會(huì)方便的多。如果您跟我一樣選擇使用批處理來實(shí)現(xiàn)的話,那么很好,很有挑戰(zhàn)性。
::::::DataFormatConvert.bat:::::
@echo off
:Initialization
set TempFile=temp.tmp
set /a num = 0
set BinaryFormat=Bin
:: 默認(rèn)為二進(jìn)制數(shù)字0或1顯示
set ConvertOption=ConvertToHex
:: 默認(rèn)為十六進(jìn)制轉(zhuǎn)換
set ShowProgress=ShowProgressOn
:: 默認(rèn)為顯示轉(zhuǎn)換進(jìn)度
set BackSpace=[將本文底部評(píng)論3中的退格符替換到此處]
:: 退格符
set Source=z%1
:: 添加一個(gè)臨時(shí)字符 z
if %Source:~1,1%z%Source:~-1%=="z" set Source=z%Source:~2,-1%
:: 檢查變量參數(shù)1的第一個(gè)和最后一個(gè)字符是否為 "" ,是的話就去掉
set Source=%Source:~1%
:: 去掉臨時(shí)字符 z
if "%Source%"=="" goto :HelpInformation
if "%Source%"=="/?" goto :HelpInformation
if /i "%Source%"=="/help" goto :HelpInformation
if not exist "%Source%" echo 目標(biāo)文件不存在 & exit /b 2
:: 檢查參數(shù)1 [注1]
if /i "%2"=="/Bin" set ConvertOption=ConvertToBin
if /i "%3"=="/Bin" set ConvertOption=ConvertToBin
if /i "%2"=="/Block" set ConvertOption=ConvertToBin & set BinaryFormat=BinBlock
if /i "%3"=="/Block" set ConvertOption=ConvertToBin & set BinaryFormat=BinBlock
if /i "%2"=="/ProgressOff" set ShowProgress=ShowProgressOff
if /i "%3"=="/ProgressOff" set ShowProgress=ShowProgressOff
:: 檢查參數(shù)2和3 [注2]
for %%i in ("%Source%") do (
set SourceDrivePathName=%%~dpni
set FileSize=%%~zi
)
:: 獲得源文件的 驅(qū)動(dòng)器號(hào)+路徑+標(biāo)題名 ,以及文件大小。 d - drive, p - path, n - name, z - size
if "%FileSize%"=="0" echo 目標(biāo)文件為空 & exit /b 3
del %TempFile% >nul 2>nul
fsutil file createnew %TempFile% %FileSize% >nul
:: 創(chuàng)建一個(gè)大小與源文件一樣的空白文件,該文件里的所有字節(jié)均為0x00
goto :%ConvertOption%
:ConvertToHex
:: 十六進(jìn)制轉(zhuǎn)換
setlocal EnableDelayedExpansion
set OutputFile="%SourceDrivePathName%.Hex.txt"
echo 文件 %Source% 的十六進(jìn)制格式:>%OutputFile%
echo. & echo 正在轉(zhuǎn)換為十六進(jìn)制...
for /f "skip=1 tokens=1,3" %%i in ('fc /b %TempFile% "%Source%"') do (
set index=0x%%i
set index=!index:~0,-1!
set /a offset = !index! - !num!
for /l %%n in (1,1,!offset!) do (
set /p=00<nul>>%OutputFile%
set /a num += 1
)
set /p=%%j<nul>>%OutputFile%
set /a num += 1
call :%ShowProgress% !num!
)
:: 通過與大小相同內(nèi)容空白的文件進(jìn)行二進(jìn)制對(duì)比,獲得源文件的十六進(jìn)制碼 [注3]
endlocal
goto :ExitSuccess
:ConvertToBin
setlocal EnableDelayedExpansion
set OutputFile="%SourceDrivePathName%.%BinaryFormat%.txt"
echo 文件 %Source% 的二進(jìn)制格式:>%OutputFile%
echo. & echo 正在轉(zhuǎn)換為二進(jìn)制...
for /f "skip=1 tokens=1,3" %%i in ('fc /b %TempFile% "%Source%"') do (
set index=0x%%i
set index=!index:~0,-1!
set /a offset = !index! - !num!
for /l %%n in (1,1,!offset!) do (
call :HexTo%BinaryFormat% 0
call :HexTo%BinaryFormat% 0
set /a num += 1
)
set HexData=%%j
call :HexTo%BinaryFormat% !HexData:~0,1!
call :HexTo%BinaryFormat% !HexData:~1,1!
set /a num += 1
call :%ShowProgress% !num!
)
endlocal
goto :ExitSuccess
:HexToBin
:: 函數(shù): HexToBin 用途: 以0或1的形式顯示
if %1==0 set /p=0000<nul>>%OutputFile%
if %1==1 set /p=0001<nul>>%OutputFile%
if %1==2 set /p=0010<nul>>%OutputFile%
if %1==3 set /p=0011<nul>>%OutputFile%
if %1==4 set /p=0100<nul>>%OutputFile%
if %1==5 set /p=0101<nul>>%OutputFile%
if %1==6 set /p=0110<nul>>%OutputFile%
if %1==7 set /p=0111<nul>>%OutputFile%
if %1==8 set /p=1000<nul>>%OutputFile%
if %1==9 set /p=1001<nul>>%OutputFile%
if %1==A set /p=1010<nul>>%OutputFile%
if %1==B set /p=1011<nul>>%OutputFile%
if %1==C set /p=1100<nul>>%OutputFile%
if %1==D set /p=1101<nul>>%OutputFile%
if %1==E set /p=1110<nul>>%OutputFile%
if %1==F set /p=1111<nul>>%OutputFile%
goto :EOF
:HexToBinBlock
:: 函數(shù): HexToBinBlock 用途: 以 或■的形式顯示[注3]
if %1==0 set /p= <nul>>%OutputFile%
if %1==1 set /p= ■<nul>>%OutputFile%
if %1==2 set /p= ■ <nul>>%OutputFile%
if %1==3 set /p= ■■<nul>>%OutputFile%
if %1==4 set /p= ■ <nul>>%OutputFile%
if %1==5 set /p= ■ ■<nul>>%OutputFile%
if %1==6 set /p= ■■ <nul>>%OutputFile%
if %1==7 set /p= ■■■<nul>>%OutputFile%
if %1==8 set /p=■ <nul>>%OutputFile%
if %1==9 set /p=■ ■<nul>>%OutputFile%
if %1==A set /p=■ ■ <nul>>%OutputFile%
if %1==B set /p=■ ■■<nul>>%OutputFile%
if %1==C set /p=■■ <nul>>%OutputFile%
if %1==D set /p=■■ ■<nul>>%OutputFile%
if %1==E set /p=■■■ <nul>>%OutputFile%
if %1==F set /p=■■■■<nul>>%OutputFile%
goto :EOF
:ShowProgressOn
:: 函數(shù): ShowProgressOn 用途: 顯示轉(zhuǎn)換進(jìn)度
set /a mod = %1 %% 50
if %mod% equ 0 (
set /a percent = %1 * 100 / %FileSize%
set /p=%BackSpace%%BackSpace%%BackSpace%<nul
set /p=!percent!%%<nul
)
goto :EOF
:ShowProgressOff
:: 函數(shù): ShowProgressOff 用途: 不顯示轉(zhuǎn)換進(jìn)度
goto :EOF
:HelpInformation
:: 該批處理的幫助信息
echo 將文件轉(zhuǎn)換為十六進(jìn)制或二進(jìn)制的格式。
echo.
echo DataFormatConvert source [/Hex ^| /Bin ^| /Block] [/ProgressOn ^| /ProgressOff]
echo.
echo source 指定要轉(zhuǎn)換的文件。
echo /Hex 表示轉(zhuǎn)換為十六進(jìn)制格式(默認(rèn))。
echo /Bin 表示轉(zhuǎn)換為二進(jìn)制格式。
echo /Block 表示轉(zhuǎn)換為二進(jìn)制格式并以方塊的形式顯示。
echo /ProgressOn 顯示轉(zhuǎn)換進(jìn)度(默認(rèn))。
echo /ProgressOff 關(guān)閉顯示進(jìn)度。
exit /b 1
:ExitSuccess
:: 成功完成并退出
del %TempFile% >nul
set /p=%BackSpace%%BackSpace%%BackSpace%%BackSpace%<nul
echo 轉(zhuǎn)換完成!
exit /b 0
::::::::::::::::::::::::::::::::
注1 exit 的參數(shù) /b ,可以退出當(dāng)前批處理腳本而不退出調(diào)用它的 CMD.EXE。如果從一個(gè)批處理腳本外執(zhí)行,則會(huì)退出 CMD.EXE 。exit 的第二個(gè)參數(shù) exitCode 是一個(gè)數(shù)字號(hào)碼,如果使用了參數(shù) /b ,這個(gè)數(shù)字號(hào)碼將成為該批處理退出的 ErrorLevel 。如果退出 CMD.EXE ,則用那個(gè)數(shù)字設(shè)置過程退出代碼。
注2 看到該批處理這些可使用的參數(shù),您可能已經(jīng)發(fā)現(xiàn)了,該批處理可以作為一條外部命令來使用,如果您把它放到 %SystemRoot%\system32 或 %SystemRoot% 路徑下的話。默認(rèn)情況下,%SystemRoot%\system32 和 %SystemRoot% 都是環(huán)境變量 PATH 的值之一(在 我的電腦->屬性->高級(jí)->環(huán)境變量 中可以查看并設(shè)置相關(guān)環(huán)境變量)。
注3 源文件通過與其大小相同內(nèi)容全為0x00的文件進(jìn)行對(duì)比后,可以將源文件中所有與0x00不同的字節(jié)內(nèi)容以十六進(jìn)制碼的形式表達(dá)出來。同時(shí),還能得到每個(gè)不同字節(jié)所在的字節(jié)數(shù)位置,通過這個(gè)也便確定了源文件中0x00的內(nèi)容。
正如注2中所說的,如果該批處理被放到了環(huán)境變量 PATH 中的路徑中,則它可以作為外部命令來為您工作。
圖8-1 DataFormatConvert 的執(zhí)行示意
十六進(jìn)制或二進(jìn)制轉(zhuǎn)換成功的文件將被寫到與源文件相同的路徑中。
對(duì)于計(jì)算機(jī)而言,十六進(jìn)制碼(或者說0和1)才能表達(dá)出它們自己的想法,盡管這些對(duì)我們來說猶如天書一般。[創(chuàng)作日期:2008-05-17]
========================================樸實(shí)的分割線========================================
8.2 別擠,自啟動(dòng)的排隊(duì)來
被放入到自啟動(dòng)項(xiàng)里的程序,從某種意義上來說,在被開啟的時(shí)候確實(shí)簡(jiǎn)化了用戶的操作。然而,在開機(jī)后眾多的程序就像春運(yùn)時(shí)期擠火車一樣的蜂擁而上,這并不是我們所期望的。請(qǐng)不要問我為什么給這個(gè)批處理起了個(gè)如此無(wú)理的名稱,所有放在 C:\WINDOWS 下的批處理我都會(huì)以小寫字母 z 打頭,方便管理。
::::::::::zLauncher.bat:::::::::
@echo off
setlocal enabledelayedexpansion
title Launching...
set /a ShortDelay = 6
set BackSpace=[將本文底部評(píng)論3中的退格符替換到此處]
set /p choice=LaunchOptions:
if not "%choice%"=="" goto :CustomLaunch
:BasicLaunch
call :LaunchItem1
call :LaunchItem2
call :LaunchItem3
call :LaunchItem4
call :LaunchItem5
goto :EOF
:CustomLaunch
for /l %%i in (0 1 9) do (
set "choice_=!choice:~%%i,1!"
if "!choice_!"=="" echo All Launched! & goto :EOF
if !choice_! gtr 9 echo Unknown Define & goto :EOF
if !choice_! lss 0 echo Unknown Define & goto :EOF
call :LaunchItem!choice_!
)
:LaunchItem1
start "OE" "C:\Program Files\Outlook Express\msimn.exe"
call :IsItemLaunchedSuccessful OE
goto :EOF
:LaunchItem2
start "Skype" "D:\Program Files\Skype\Phone\Skype.exe" /nosplash /minimized
call :IsItemLaunchedSuccessful Skype
goto :EOF
:LaunchItem3
Start "QQ" "D:\Program Files\Tencent\QQ\QQ.exe"
call :IsItemLaunchedSuccessful QQ
goto :EOF
:LaunchItem4
start "BaiduHi" /min "D:\Program Files\baidu\Baidu Hi\BaiduHi.exe"
call :IsItemLaunchedSuccessful BaiduHi
goto :EOF
:LaunchItem5
start "Thunder" /min "D:\Program Files\Thunder Network\Thunder\Thunder.exe"
call :IsItemLaunchedSuccessful Thunder
goto :EOF
:LaunchItem6
start "Tudou" /min "D:\Program Files\Tudou\iTudou\iTudou.exe"
call :IsItemLaunchedSuccessful Tudou
goto :EOF
:LaunchItem7
start "MSN" /min "C:\Program Files\MSN Messenger\msnmsgr.exe"
call :IsItemLaunchedSuccessful MSN
goto :EOF
:IsItemLaunchedSuccessful
set /p =Launching %1<nul & title Launching %1
if ERRORLEVEL 0 (
for /l %%i in (1,1,4) do (
ping -n %ShortDelay% 127.1>nul
set /p =.<nul
)
)
for /l %%i in (1,1,32) do set /p =%BackSpace%<nul
echo %1 Launched
title %1 Launched
ping -n %ShortDelay% 127.1>nul
goto :EOF
::::::::::::::::::::::::::::::::
看得出來,這是一個(gè)科技含量很低的批處理,僅僅是在 start 每個(gè)程序之間將其掛起一段時(shí)間來避免眾多程序同時(shí)啟動(dòng)所帶來的負(fù)荷。當(dāng)然,為了使它能夠發(fā)揮作用,您得親自配置它所要啟動(dòng)的程序,以及程序所在的路徑才行。[創(chuàng)作日期:2008-08-14]
參考:
[1] [原創(chuàng)]CMD批處理獲取文件的ASCII碼 中國(guó)DOS聯(lián)盟
[2] 點(diǎn)陣漢字顯示 CSDN博客
[3] Fsutil 百度百科
目錄:
批處理的學(xué)習(xí)之一[前言]
批處理的學(xué)習(xí)之二[顯示篇]
批處理的學(xué)習(xí)之三[賦值 調(diào)用 參數(shù)]
批處理的學(xué)習(xí)之四[條件 循環(huán)]
批處理的學(xué)習(xí)之五[組合命令 管道命令]
批處理的學(xué)習(xí)之六[常用實(shí)例 上]
批處理的學(xué)習(xí)之七[常用實(shí)例 下]
批處理的學(xué)習(xí)之八[番外篇]
聯(lián)系客服