BitConverter.ToStringの逆をやるには?


小梅  2005-11-12 01:28:33  No: 127573

教えて下さい。VB.NETで、
Byte型の配列を文字列に変換するのに、
Dim strWk As String = BitConverter.ToString(byteArray)
これを、使って一発変換できますが、
これの逆、つまり、このstrWkに入った文字列をByte型の配列にセットする
一番良い方法とは、どうゆう方法がありますでしょうか?
よろしくお願いします。


特攻隊長まるるう  2005-11-18 19:50:02  No: 127574

BitConverter.GetBytes メソッド (Char)使えばいいんじゃない?。
もしくは
System.Text.Encoding  クラスを調べてみるとか。

ボクはプログラミングにおいて一番良い方法と言われると、
既存の関数を使うことではなく、基礎的なコマンドを自分の力で
組み合わせて目的の関数を自作する事だと思ってます。
>一番良い方法とは、どうゆう方法がありますでしょうか?
そんなこと書かれるとレス付けるのが怖くなります。いくら経験を
積んでも更に良いロジックは後から考え出されるので、

        一番良い方法 = 自分で考え出す

…でしょうかねぇ(^^;)。


なな  2005-11-18 22:38:59  No: 127575

>        一番良い方法 = 自分で考え出す
>
> …でしょうかねぇ(^^;)。

私の場合、自作関数で逆のことをやれて居ますが、
どうゆう観点で良し悪しを判断するのかも曖昧なまま
何を持ってして一番良いと判断するんだろうね。

その評価の仕方をまずは教えて欲しいです。


マグ  2005-11-19 18:33:08  No: 127576

Dim str As String
        Dim byteA() As Byte
        ReDim byteA(2)
        byteA(0) = 61
        byteA(1) = 62
        byteA(2) = 63
        str = BitConverter.ToString(byteA)
        MessageBox.Show(str)

このソースで試していたら、これ、単純に16進数に変換されていました。
16進数から10進数に変換させるソースを組めば戻すことは可能になると思います。
あと、ハイフンで数字を区切られているので、楽になると思います。
一番、いい方法と書かれていますが、小梅さんがいい方法と判断するのはどこら辺までですか・・・・・・・
逆変換するのを自作関数として作っておけば、いい方法になります。
としか答えようがない・・・・・・・・・・・・


なな  2005-11-20 02:22:14  No: 127577

例示をだして、それは一番いい方法ではありません。
等といわれるのは、私はゴメンです。


マグ  2005-11-21 02:36:42  No: 127578

時間があったので、ちゃちゃっと作ってみました。
16進数から10進数の変換って関数を使った方が速いかも(ーー;)
でも、面白そうだったので、関数を使わずに、変換するのを作ってみました。
それと、参考程度にお願いします。・・・・・・・・・・なるかな?
あと、小梅さん、質問内容に注意した方がいいかも?です。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim str As String
        Dim byteA() As Byte, byteB() As Byte
        Dim check As Boolean
        ReDim byteA(2) : ReDim byteB(2)
        byteA(0) = 61
        byteA(1) = 62
        byteA(2) = 63
        str = BitConverter.ToString(byteA)
        MessageBox.Show(str)
        Dim cls As Converter
        cls = New Converter
        check = cls.Decode(str, byteB)
        Dim i As Integer
        If check Then
            For i = 0 To UBound(byteB)
                MessageBox.Show(byteB(i))
            Next
        Else
            MessageBox.Show("変換に失敗しました。", "Error")
        End If
    End Sub
End Class

Public Class Converter

    Public Function Decode( _
                        ByVal [String] As String, _
                        ByVal Bytes() As Byte) As Boolean

        Dim index As Integer, index2 As Integer
        Dim count As Integer
        count = 0 : index2 = 0
        Decode = False
        Try
            Do
                index = [String].IndexOf("-", index2)
                If index <> -1 Then
                    Bytes(count) = To16([String].Substring(index2, index - index2))
                    index2 = index + 1
                    count += 1
                Else
                    Bytes(count) = To16([String].Substring(index2))
                    Decode = True
                    Exit Do
                End If
            Loop
        Catch ex As Exception
            Exit Function
        End Try

    End Function

    '16進数を10進数に変換
    Private Function To16(ByVal Get16 As String) As Integer
        Dim sansyutu As Integer = 0
        Dim souko As Integer = 0
        Dim data As String = 0
        Dim i As Integer
        For i = 0 To Get16.Length - 1
            data = Get16.Substring(i, 1)
            Try
                If Not (data >= 0 And data <= 9) Then
                    Return 0
                End If
            Catch ex As Exception
                If Not ((data >= "A" And data <= "F") Or _
                (data >= "a" And data <= "f")) Then
                    Return 0
                End If
            End Try
            souko = Get16.Length - i - 1
            sansyutu += (para(data) * (Math.Pow(16, souko)))
        Next
        Return sansyutu
    End Function

    Private Function para(ByVal data As String) As Integer
        Select Case data
            Case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
                para = data
            Case "A", "a"
                para = 10
            Case "B", "b"
                para = 11
            Case "C", "c"
                para = 12
            Case "D", "d"
                para = 13
            Case "E", "e"
                para = 14
            Case "F", "f"
                para = 15
        End Select
    End Function

End Class


あん  2005-11-21 03:08:12  No: 127579

16進から10進は

str16進 = "AA"
int10進 = Cint("&h" + str16進)

でできますよ


マグ  2005-11-22 22:58:47  No: 127580

>あんさん
ソースを載せる前の文章を読んでください。
余計な労力を使わせてしまって、すみませんでしたm(--)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加