• ベストアンサー

1バイト文字の上位4ビット・下位4ビットの入れ替え方法を教えて下さい

あるパスワードをテキストファイルに書き込む処理です。 そのままだと、パスワードの意味が無いので、上位4ビットと下位4ビットを入れ替えて保存しようと思います。 上位・下位それぞれ4ビットシフトするところまでは出来ました。  Dim a As Integer  Dim a1 As Integer  Dim a2 As Integer  a = Asc("a")  a1 = a \ 2 ^ 4  a2 = a * 2 ^ 4  MsgBox (Hex(a1))  MsgBox (Hex(a2)) が、それを8ビットに戻す方法が分かりません。 また、パスワードは1バイト文字による文字列ですが、文字列長分を1バイトずつバッファに読み込んで、変換し、同サイズのバッファに詰め込んでいく処理も分かりません。 以前、MS-C(MSDOS上のC言語)を少しやったので、それでなら分かるのですが、VBは全くの初心者で、調べても調べても見当がつきません。 どうか教えて下さい。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

●1バイト文字の上位4ビット・下位4ビットの入れ替え 参考。理解・確認のため余分なものを入れている。 骨子は*****のところ。 Sub test01() h = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", _ "9", "A", "B", "C", "D", "E", "F") a = Asc("z") MsgBox "コード" & a x = a Mod 16 '***** y = Int(a / 16) '***** MsgBox "16進表示" & h(x) & " " & h(y) 'もとの数のビット列 s = "" x = a For i = 1 To 8 y = x Mod 2 s = y & s x = Int(x / 2) Next i MsgBox "もとの数のビット列" & s '---- '上位・下位4ビット反転 x = a Mod 16 y = Int(a / 16) z = x * 16 + y '***** MsgBox "上位・下位4ビット反転のコード" & z x = z Mod 16 y = Int(z / 16) MsgBox "16進表示" & h(x) & " " & h(y) '------上位・下位4ビット反転のビット列 s = "" x = z For i = 1 To 8 y = x Mod 2 s = y & s x = Int(x / 2) Next i MsgBox "上位・下位4ビット反転" & s End Sub ●文字列長分を1バイトずつバッファに読み込んで、変換し、同サイズのバッファに詰め込んでいく処理も分かりません 上記でもやってますが、 S="" For i=1 to 文字列長 Xには1バイト分上位・下位4ビット反転した結果を入れる S=S & X Next i を使えば良いです。 下位桁から処理なら S= X & S にする。

その他の回答 (3)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

Private Sub Form_Click() Dim a As Byte Dim b As Byte Dim i As Integer For i = 0 To &HFF a = i b = (a And &HF) * &H10 Or (a And &HF0) \ &H10 Debug.Print Hex(a), Hex(b) Next End Sub

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>文字列長分を1バイトずつバッファに読み込んで、変換し、同サイズのバッファに詰め込んでいく処理 for i=1 to len(strbuff) Mid(strbuff, i, 1) = 変換(Mid(strbuff, i, 1)) Next next

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

> それを8ビットに戻す方法が分かりません。 文字→8ビットは、  a = Asc("a") で出来ていますね。 Asc関数をヘルプで調べると、関連項目にChrという関数がありますので、こちらを利用します。

関連するQ&A

  • S-JISの2バイト文字をURLエンコードするには

    VBでSJISの2バイト文字をURLエンコードをしたいのですが、適切にエンコードできません。 エンコード規則は「%上位バイトの16進数%下位バイトの16進数」では足りないのでしょうか? 例えば、「指」という文字を巷のエンコードサイトにかけると「%8Ew」という結果になりますが、 Public Sub test() Dim strTmp As String strTmp = Format(Hex(Asc("指")), "0000") MsgBox ("%" & Left(strTmp, 2) & "%" & Right(strTmp, 2)) End Sub だと「%80%00」になってしまいます。 「%00」は文字列終端コードだそうですが、どんな処理をかけたらよいのでしょうか? 解決法・調べ方等、何でも結構ですので、 ご教授下さいますようよろしくお願いします!

  • 文字型変数を使って2進数表示すると、最上位ビットに1を立てると値に-記号が入ってしまいます

    VB6.0 WindowsXP 掲題の件ですが以下のコードを使って16進数を2進数表示にしていますが、最上位ビットに1を立てると値がおかしくなってしまいます。 Private Sub Form_Load() Dim dat(5) As Variant Dim i As Variant dat(0) = Right("0000000000000000" & Hex2Bin(Hex(&HFFFF)), 16) dat(1) = Right("0000000000000000" & Hex2Bin(Hex(&HFFFE)), 16) dat(2) = Right("0000000000000000" & Hex2Bin(Hex(&HFF00)), 16) dat(3) = Right("0000000000000000" & Hex2Bin(Hex(&HF000)), 16) dat(4) = Right("0000000000000000" & Hex2Bin(Hex(&HF0F0)), 16) dat(5) = Right("0000000000000000" & Hex2Bin(Hex(&H7FFF)), 16) For i = 0 To 5 Label1.Caption = Label1.Caption & dat(i) & vbCrLf Next Label2.Caption = "FFFF" & vbCrLf & "FFF0" & vbCrLf & "FF00" & vbCrLf & "F000" & vbCrLf & "F0F0" End Sub Public Function Hex2Bin(Hex) Dim Dec Dec = CInt("&H" + Hex) Hex2Bin = Dec2Bin(Dec) End Function Public Function Bin2Hex(Bin) Dim Dec Dec = Bin2Dec(Bin) Bin2Hex = Hex(Dec) End Function Public Function Dec2Bin(ByVal Dec) Do Dec2Bin = CStr(Dec Mod 2) & Dec2Bin Dec = Dec \ 2 Loop Until Dec = 0 End Function Public Function Bin2Dec(Bin) Dim i As Integer For i = 1 To Len(Bin) Bin2Dec = Bin2Dec * 2 + CInt(Mid(Bin, i, 1)) Next End Function なぜこうなってしまうのか、最上位に1を入れても1000000000000 のように表示させるにはどうしたらよいか教えていただきたいです。 よろしくお願いします。

  • 文字制限方法。

    どなたか知識ある方、教えてください。 ソートプログラムの演習をしているんですが、 どのように書いていいか悩んでます。現在の課題はtextが10個あり、sortボタンをクリックすると左から数字を小さい順に並びます、数字のみ入力可、空白でもエラーなしで(全て空白はエラー)とりあえず数字があれば10個埋めていなくても並べる、文字等はエラーを出したいです。 '配列のインデックス番号の開始に1を設定 Option Base 1 Option Explicit Private Sub cmdCLEAR_Click() '変数の宣言 Dim ans As Integer Dim i As Integer '消去する際の確認事項 ans = MsgBox("消去していいですか?", vbYesNo + vbQuestion) Select Case ans Case vbYes For i = 1 To 10 Step 1 Text(i).Text = "" Next i Case vbNo MsgBox "取り消します", vbInformation End Select End Sub Private Sub cmdSORT_Click() '変数の宣言 Dim intNum(10) As Integer Dim S As Integer Dim j As Integer Dim k As Integer Dim i As Integer '配列の整理 For i = 1 To 10 Step 1 intNum(i) = Int(Text(i).Text) Next i 'バブルソート For k = 1 To 9 Step 1 For j = 1 To 9 Step 1 If intNum(j) > intNum(j + 1) Then S = intNum(j) intNum(j) = intNum(j + 1) intNum(j + 1) = S End If Next j Next k '結果を返して表記する For i = 1 To 10 Step 1 Text(i).Text = intNum(i) Next i End Sub 現在書いたのはここまででどうしてもエラーと文字制限の方法はわからないので教えていただける方、宜しくお願いします。

  • [VB.NET] 処理の高速化を行いたい。

    教えて下さい。 あるファイルの1バイトづつローテートを行いファイルの書き出しを行っています。(ビット演算による暗号化) しかし以下の処理の場合、サイズの大きいファイルを扱った場合に多くの処理時間がかかってしまいます。 もっと処理を高速化する事は可能でしょうか? ----------------------------------------------------------------- ' 読み込みファイル Private Const READ_FILE As String = "c:\temp\date.Text" ' 書き込みファイル Private WRIT_FILE As String = "c:\temp\date.dat" ' オブジェクト作成 Dim br As New System.IO.FileStream(READ_FILE, IO.FileMode.Open, IO.FileAccess.Read) Dim bw As New System.IO.StreamWriter(WRIT_FILE, False, System.Text.Encoding.GetEncoding("iso-8859-1")) Dim m As Integer = 3 ' 3ビット左回転 Dim n As Integer ' 1バイトづつ処理 For I As Integer = 0 To CType(br.Length, Integer) - 1 ' 16進数を10進数へ変換 n = ("&h" & String.Format("{0:X2}", br.ReadByte)) ' mビット左へローテート処理を行いファイルへ書き込み bw.Write(ChrW("&h" & Hex(Int((n / 2 ^ (8 - m)) + (n * 2 ^ m And 255))))) Next ' 閉じる bw.Close() br.Close() ----------------------------------------------------------------- よろしくお願いします。

  • リトルエンディアンの1byteデータのビット割付

    リトルエンディアン方式と聞くと2byteデータだったら上位下位が逆転して メモリに割りついているって認識なんですけども、ビット割付も逆転している認識 で問題ないでしょうか? 例えば、1byteの0x1Fというデータがリトルエンディアン方式のビット割付だった場合 1111 0001という割付になるのでしょうか?

  • 文字列を変数名として扱う方法

    vb6.0 か vb.net で文字列を変数名として扱うにはどうすればいいでしょうか? 例をあげると下記のようなことです。 -------------------- dim abc as string dim x as string abc = "テスト" x = "b" msgbox "a" & x & "c" -------------------- これをそのままvb6.0で実行すると"abc"という文字が表示されますが "abc"ではなく"テスト"と表示させたいのです。 つまり msgbox abc とした場合と同じようにしたいのですが可能でしょうか? ご存知の方教えてください。 よろしくお願いします。

  • VBE Excelのマクロがわかりません(IF関数)

    エクセルのマクロがわかりません。教えてください 問題は5人の簿記の点数を入力し5人の合計点・最高点・最低点を表示するプログラムを作成する。というものです。 Sub test() Dim boki as integer Dim sum as integer Dim max as integer Dim min as integer For A = 1 to 5 boki = InputBoxx("簿記の点数入力") goukei = goukei + boki ?????? Next A Msgbox"5人の合計点は"&A Msgbox"5人の最高点は"&A Msgbox"5人の最低点は"&A End Sub IF関数を使って??の部分を作るようなのですが、いまいちよく分からないので教えてください。 bokiは簿記 sumは合計 maxは最高 minは最低のことを現してます。

  • VBAのプロシージャーと変数の名前の区別について

    VBAの初心者です。教えてください。 Sub ex() Dim a As Integer Dim b As Integer a = 2 a a, b MsgBox b End Sub Sub a(a As Integer, b As Integer) b = a End Sub 上記のプログラムを実行するとうまくいきません。VBAのプロシージャーと変数って同じ名前を使うとだめなのですか?教えてください。

  • エクセルVBAで、Dim A As StringとA$

    変数を使用するにあたり、 Dim A As String A=Sheets("Sheet1").range("A1").Value MsgBox A という記述方と、 A$=Sheets("Sheet1").range("A1").Value MsgBox A$ という記述は同じ意味だと思うのですが、何か違いがあるのでしょうか? Stringなら「$」、Integerなら「%」で、いちいちDimで整数か文字列かを指定しなくていいだけ簡単だと思うのですが、わざわざDimを使う意味は何なのでしょうか?

  • 【VB.Net】バイト型配列に読み込んで改行区切り

    教えて下さい。 ファイルをバイト型配列に読み込んで、ある固定長に区切(改行)って出力したいです。 以下簡単にサンプルとして作っているのが以下です。 【読み込みファイル.txt】 ---------------------------------------------------------------------------------- AB ---------------------------------------------------------------------------------- このテキストファイルの内容(byte型では、"41 42")を1バイトづつに改行で区切りたいです。 【VB.Net】 ---------------------------------------------------------------------------------- Dim BUFSIZE As Integer = 1 ' 1バイトづつ処理 Dim buf(BUFSIZE) As Byte ' 読み込み用バッファ Dim readSize As Integer ' Readメソッドで読み込んだバイト数 Dim srcName As String = "C:\Temp\読み込みファイル.txt" ' 読み込みファイル名 Dim dstName As String = "C:\Temp\書き込みファイル.txt" ' 書き込みファイル名 Using src As New FileStream(srcName, FileMode.Open, FileAccess.Read) Using dest As New FileStream(dstName, FileMode.Create, FileAccess.Write) While True ' 1バイト読み込み readSize = src.Read(buf, 0, BUFSIZE) ' 読み込むものが無ければ終了 If readSize = 0 Then Exit While ' 改行いれたい部分(動かないけど、、、) buf = (0D,0A) ' 書き込み dest.Write(buf, 0, BUFSIZE) End While End Using End Using ---------------------------------------------------------------------------------- ↓ 理想の処理後 【書き込みファイル.txt】 ---------------------------------------------------------------------------------- A B ---------------------------------------------------------------------------------- 重要なのはバイト型で処理を行いたいです。(文字列ではない) すいませんがよろしくお願いします。

専門家に質問してみよう