投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/8/29 16:45:44
> xxxxxxが,複数文字であっても,asc1には,先頭の1文字分しか,16進数変換されないようですが,

違いますよ?

Asc 関数が「先頭の 1 文字」を対象とする点に関しては、確かにそのとおりです。
(なので、長さゼロの文字列を変換しようとするとエラーになります)

しかしながら「16進数変換」する機能は持ち合わせていません。
単に、その 1 文字を表す「整数値」を返すだけです。

数値を16進数文字列に変換するのは、Hex 関数の仕事ですし、
数値を8進数文字列に変換するのは、Oct 関数の仕事です。

MsgBox CStr(2023)  ' … "2023" 
MsgBox Oct(2023)  ' … "3747" 
MsgBox Hex(2023)  ' … "7E7" 

MsgBox CStr(&O3747)  ' … "2023" 
MsgBox Oct(&O3747)  ' … "3747" 
MsgBox Hex(&O3747)  ' … "7E7" 

MsgBox CStr(&H7E7)  ' … "2023" 
MsgBox Oct(&H7E7)  ' … "3747" 
MsgBox Hex(&H7E7)  ' … "7E7" 




> xxxxxx全ての,16進数変換は出来る方法はないのでしょうか

たとえば、こんな感じに書けます。
第二引数には文字コードを指定してください。省略時には "Shift_JIS" とみなします。

Public Function ToHexString(ByVal Text As StringOptional ByVal Charset As String = "Shift_JIS"As String
    Dim x As Object, y As Object
    Set x = CreateObject("ADODB.Stream")
    x.Open
    x.Charset = Charset
    x.WriteText Text
    x.Position = 0
    x.Type = 1
    Set y = CreateObject("Msxml2.DOMDocument").createElement("x")
    y.DataType = "bin.hex"
    y.NodeTypedValue = x.Read(-1&)
    x.Close
    ToHexString = y.Text
End Function


Debug.Print ToHexString("佐久 誠", "Shift_JIS")     '8db28b76814090bd
Debug.Print ToHexString("佐久 誠", "EUC-KR")        'f1a5cef9a1a1e1a4
Debug.Print ToHexString("佐久 誠", "EUC-JP")        'bab4b5d7a1a1c0bf
Debug.Print ToHexString("佐久 誠", "iso-2022-jp")   '1b24423a3435572121403f1b2842
Debug.Print ToHexString("佐久 誠", "UTF-16BE")      '4f504e4530008aa0
Debug.Print ToHexString("佐久 誠", "UTF-16LE")      'fffe504f454e0030a08a
Debug.Print ToHexString("佐久 誠", "UTF-8")         'efbbbfe4bd90e4b985e38080e8aaa0
Debug.Print ToHexString("佐久 誠", "UTF-7")         '2b5431424f525441416971412d



CreateObject などの外部ライブラリに頼らない手法としては、
 Len 関数で文字数を数えて、
 For ~ Next ステートメントで文字数分だけのループ処理を行い、
 Mid 関数で先頭から 1 文字ずつ切り出した上で、
 Asc 等で変換した結果を、Hex 関数で繋いでいく
という実装手順がしばしば用いられます。

Integer 値を Hex 関数に渡した場合、結果が 1~4文字の可変長になりますので、
必要に応じて、不足した桁に "0" を補ってやる処理も必要ですね。


> asc1=Asc(xxxxxx)

AscB 関数は、バイナリデータの先頭バイトの値を返します。
Asc 関数は、既定の文字集合(日本語圏だと Shift_JIS 相当) における文字コードの値を返します。
AscW 関数は、Unicode の文字集合における該当文字のコードポイントを返します。

AscB の結果は Byte 型(0~255 の範囲)ですが、
Asc や AscW の結果は Integer 型であり、負数が返されることもあります。