[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/05/24(Tue) 19:45
投稿者名:まな
URL :
タイトル:
16進→2進変換での0処理
16進と2進のデータのやりとりについての質問です。
例えば、
16進    2進
00     00000000
01       00000001
10      00010000
FF       11111111
と認識させたいと思っております。
下記では 01 は 1 としか認識せずうまくいきません。
これを、00000001と表示したいと思っています。
良いやり方を教えていただけないでしょうか?
よろしくお願いします。

Dim a as Long
d = "01"
a = Val("&H" & d)

投稿時間:2005/05/24(Tue) 19:55
投稿者名:ガッ
Eメール:
URL :
タイトル:
Re: 16進→2進変換での0処理
> 16進と2進のデータのやりとりについての質問です。
ノ<とりあえず、文字列処理ですね。

> 例えば、
> 16進    2進
>  00     00000000
>  01       00000001
>  10       00010000
>  FF       11111111
> と認識させたいと思っております。
入力の16進数表記の範囲は2文字で、"00"(または"0")〜"FF"という
ことですね?
そして出力は2進数表記で必ず8文字になると…

> 下記では 01 は 1 としか認識せずうまくいきません。
> これを、00000001と表示したいと思っています。
> 良いやり方を教えていただけないでしょうか?
> よろしくお願いします。
>
> Dim a as Long
> d = "01"
> a = Val("&H" & d)
これは16進表記を数値として変換するためのコードです。
今やるべきなのは、16進数表記→2進数表記なのでは?
とりあえず、方向が違うので(orz)です。
2進数表記に直せる段階までがんばってください。

投稿時間:2005/05/24(Tue) 20:01
投稿者名:まな
URL :
タイトル:
Re^2: 16進→2進変換での0処理
ありがとうございます。
2進表記までやってみます。

投稿時間:2005/05/25(Wed) 04:22
投稿者名:いな
Eメール:
URL :
タイトル:
Re^3: 16進→2進変換での0処理
...納品前の生き抜きにです。
バグっていたらすまぬ。

Option Explicit

Public Const strHexPreFix As String = "&H"

Public Function Change_16to2(TenNo As String) As String
    Change_16to2 = Change_10to2(Val(strHexPreFix & TenNo))
End Function
Public Function Change_2to16(TenNo As String) As String
    Change_2to16 = strHexPreFix & Right("00" & Change_2to10(TenNo), 2)
End Function

Public Function Change_10to2(TenNo As Double) As String

    Dim Work    As String
    Dim Kazu    As Long
    Dim kazu2   As Double
    Dim Cnt     As Integer
    
    Work = ""
    Cnt = 0
    If InStr(TenNo, ".") > 0 Then
        '小数点有り
        Kazu = Int(TenNo)
        Do
            Work = CStr(Kazu Mod 2) & Work
            Kazu = Kazu \ 2
        Loop While Kazu > 0
        kazu2 = TenNo - Int(TenNo)
        Work = Work & "."
        Do While kazu2 <> 0
            Work = Work & CStr(Int(kazu2 * 2))
            kazu2 = kazu2 * 2
            If kazu2 >= 1 Then
                kazu2 = kazu2 - 1
            End If
            Cnt = Cnt + 1
            If Cnt = 100 Then 'ストッパー
                Exit Do
            End If
        Loop
    Else
        '小数点無し
        Kazu = Int(TenNo)
        Do
            Work = CStr(Kazu Mod 2) & Work
            Kazu = Kazu \ 2
        Loop While Kazu > 0
    End If
    
    If Len(Work) = 0 Then
        Work = "0"
    End If
    Change_10to2 = Work
    
End Function

Public Function Change_2to10(TwoNo As String) As Double

    Dim Work    As Double
    Dim i       As Integer
    Dim kake    As Double
    
    Work = 0
    kake = 1
    
    If InStr(TwoNo, ".") > 0 Then
        '小数点有り
        For i = InStr(TwoNo, ".") - 1 To 1 Step -1
            If Mid$(TwoNo, i, 1) = "1" Then
                Work = Work + kake
            End If
            kake = kake * 2
        Next i
        kake = 0.5
        For i = InStr(TwoNo, ".") + 1 To Len(TwoNo)
            If Mid$(TwoNo, i, 1) = "1" Then
                Work = Work + kake
            End If
            kake = kake / 2
        Next i
    Else
        '小数点無し
        For i = Len(TwoNo) To 1 Step -1
            If Mid$(TwoNo, i, 1) = "1" Then
                Work = Work + kake
            End If
            kake = kake * 2
        Next i
    End If
    
    Change_2to10 = Work

End Function

投稿時間:2005/05/26(Thu) 16:52
投稿者名:りっとっと
Eメール:
URL :
タイトル:
Re^4: 16進→2進変換での0処理
シンプルにすると下記のようになるかな
Text1に16進数を入力するとText3に2進数が、Text2に2進数を入力するとText3に16進数が表示されま
す。
Private Sub Text1_Change()
    Dim cnt As Integer
    Dim buf As Long
    Dim BitData As String
    buf = Val("&H" & Text1.Text & "&")
    While buf <> 0
        BitData = (buf Mod 2) & BitData
        buf = buf \ 2
        cnt = cnt + 1
    Wend
    BitData = String(cnt Mod 8, "0") & BitData
    Text3.Text = BitData
End Sub

Private Sub Text2_Change()
    Dim buf As Long
    Dim hexData As String
    For cnt = 0 To Len(Text2.Text) - 1
        buf = buf + Val(Mid(Text2.Text, Len(Text2.Text) - cnt, 1)) * 2 ^ Val(cnt)
    Next
    hexData = Hex(buf)
    Text3.Text = String(Len(hexData) Mod 2, "0") & hexData
End Sub

投稿時間:2005/05/27(Fri) 17:04
投稿者名:まな
URL :
タイトル:
Re^5: 16進→2進変換での0処理
色々ご指導ありがとうございました。
「0」の認識がやはり難しかったので、下記のように行いました。

    If kazu_1 = "0" Then kazu_1 = "0000"
    If kazu_1 = "1" Then kazu_1 = "0001"
    If kazu_1 = "2" Then kazu_1 = "0010"
    If kazu_1 = "3" Then kazu_1 = "0011"
    If kazu_1 = "4" Then kazu_1 = "0100"
    If kazu_1 = "5" Then kazu_1 = "0101"
    If kazu_1 = "6" Then kazu_1 = "0110"
    If kazu_1 = "7" Then kazu_1 = "0111"
    If kazu_1 = "8" Then kazu_1 = "1000"
    If kazu_1 = "9" Then kazu_1 = "1001"
    If kazu_1 = "A" Then kazu_1 = "1010"
    If kazu_1 = "B" Then kazu_1 = "1011"
    If kazu_1 = "C" Then kazu_1 = "1100"
    If kazu_1 = "D" Then kazu_1 = "1101"
    If kazu_1 = "E" Then kazu_1 = "1110"
    If kazu_1 = "F" Then kazu_1 = "1111"

    If kazu_2 = "0" Then kazu_2 = "0000"
    If kazu_2 = "1" Then kazu_2 = "0001"
    If kazu_2 = "2" Then kazu_2 = "0010"
    If kazu_2 = "3" Then kazu_2 = "0011"
    If kazu_2 = "4" Then kazu_2 = "0100"
    If kazu_2 = "5" Then kazu_2 = "0101"
    If kazu_2 = "6" Then kazu_2 = "0110"
    If kazu_2 = "7" Then kazu_2 = "0111"
    If kazu_2 = "8" Then kazu_2 = "1000"
    If kazu_2 = "9" Then kazu_2 = "1001"
    If kazu_2 = "A" Then kazu_2 = "1010"
    If kazu_2 = "B" Then kazu_2 = "1011"
    If kazu_2 = "C" Then kazu_2 = "1100"
    If kazu_2 = "D" Then kazu_2 = "1101"
    If kazu_2 = "E" Then kazu_2 = "1110"
    If kazu_2 = "F" Then kazu_2 = "1111"
    
    kazu_total = kazu_1 & kazu_2

かなり、強引でしょぼいです。。

投稿時間:2005/05/27(Fri) 17:39
投稿者名:GOD
Eメール:
URL :
タイトル:
こんな方法も・・・
Private Sub Command1_Click()
    Debug.Print HexToBin("F1")
End Sub

Private Function HexToBin(strHex As String) As String
    Dim varBin As Variant
    Dim strBin As String
    Dim lngCount As Long

    varBin = Array("0000", "0001", "0010", "0011", _
                   "0100", "0101", "0110", "0111", _
                   "1000", "1001", "1010", "1011", _
                   "1100", "1101", "1110", "1111")
    strBin = ""
    For lngCount = 0 To Len(strHex) - 1
        strBin = strBin & (varBin("&H" & Mid(strHex, lngCount + 1, 1)))
    Next
    HexToBin = strBin
End Function