掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Shift-jis⇔2進数 ができる関数 (ID:35893)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
では私はUnicode対応という事で、守備範囲はD6-D2010です。 こういうの見るとムラムラするんですよね。 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Edit2: TEdit; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} //文字列を二進数文字列に-------------------------------------------------------- function ByteToStr(b:Byte):Char; begin if b=0 then Result := '0' else Result := '1'; end; function WordToBinStr(w:Word; b:Byte):WideString; var i: Integer; begin SetLength(Result,b); for i := 1 to b do Result[i] := ByteToStr(Byte((w shr (b-i)) and $1)); end; function WideCharToBinStr(wc:WideChar):WideString; begin //WideCharは16bit = UNICODE Result := WordToBinStr(Word(wc),SizeOf(wc)*8); end; function AnsiCharToBinStr(ac:AnsiChar):WideString; begin //AnsiCharは8bit = Shift-JIS Result := WordToBinStr(Word(ac),SizeOf(ac)*8); end; function WideStringToBinStr(wStr:WideString):WideString; var i:Integer; begin for i := 1 to Length(wStr) do Result := Result + WideCharToBinStr(wStr[i]); end; function AnsiStringToBinStr(aStr:AnsiString):WideString; var i:Integer; begin for i := 1 to Length(aStr) do Result := Result + AnsiCharToBinStr(aStr[i]); end; //二進数文字列を文字列に-------------------------------------------------------- function BinAnsiCharToWord(var bChar:AnsiChar):Word; begin if bChar='1' then Result := 1 else Result := 0; end; function BinWideCharToWord(var bChar:WideChar):Word; begin if bChar='1' then Result := 1 else Result := 0; end; function BinChar8ToChar(var ptChar:PAnsiChar):AnsiChar; var bSize : Byte; i: Integer; w: Word; begin w := 0; bSize := SizeOf(AnsiChar)*8; for i := 0 to bSize - 1 do begin w := (w Shl 1) or BinAnsiCharToWord(ptChar^); inc(ptChar); end; Result := AnsiChar(w); end; function BinChar16ToChar(var ptChar:PWideChar):WideChar; var bSize : Byte; i: Integer; w: Word; begin w := 0; bSize := SizeOf(WideChar)*8; for i := 0 to bSize - 1 do begin w := (w Shl 1) or BinWideCharToWord(Char(ptChar^)); inc(ptChar); end; Result := WideChar(w); end; function Bin8StrToString(str:AnsiString):AnsiString; var ptChar:PAnsiChar; begin ptChar := @str[1]; repeat Result := Result + BinChar8ToChar(ptChar); until ptChar^=Char(0); end; function Bin16StrToString(str:WideString):WideString; var ptChar:PWideChar; begin ptChar := @str[1]; repeat Result := Result + BinChar16ToChar(ptChar); until ptChar^=Char(0); end; //------------------------------------------------------------------------------ //汎用関数 //Shift-JIS -> 2進数文字列 function ShiftJISToBinStr(str:string):string;begin Result := AnsiStringToBinStr(str); end; //2進数文字列 -> Shift-JIS function BinStrToShiftJIS(str:string):string;begin Result := Bin8StrToString(str); end; //Unicode -> 2進数文字列 function UnicodeToBinStr(str:string):string;begin Result := WideStringToBinStr(str); end; //2進数文字列 -> Unicode function BinStrToUnicode(str:string):string;begin Result := Bin16StrToString(str); end; //------------------------------------------------------------------------------ //用例 procedure TForm1.Button1Click(Sender: TObject); begin //Shift-JIS -> 2進数文字列 Edit2.Text := ShiftJISToBinStr(Edit1.Text); end; procedure TForm1.Button2Click(Sender: TObject); begin //2進数文字列 -> Shift-JIS Edit1.Text := BinStrToShiftJIS(Edit2.Text); end; end. ご覧の通り最適化の余地はふんだんにあります、 可読性を重視しました。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.