.net chr() asc()について

解決


godspeed  URL  2003-07-12 12:40:59  No: 107768

godspeedと申します。いきなりですが。
Asc("こ")  '-32079
Hex(-32079)  'FFFF82B1
このFFFFをカットして82B1として扱います。
"&H" + 82B1  '33457
chr(33457)  '"こ"
という風になるのですが^^
これはありうるのですか?
http://www10.ocn.ne.jp/~godspeed/downloads.htm
UPしたので試してみてください。ソースはUPしてませんが。
このやり方で変換しています。


魔界の仮面弁士  2003-07-13 02:23:38  No: 107769

データ型を間違えているのでは無いでしょうか。
「Integer型の-32079」をHex関数にかければ、"82B1" になりますが、
「Long型の-32079」ならば、"FFFF82B1" です。

そしてVB6の場合、Asc関数の戻り値は、Integer型です。
一方、&HFFFF82B1 という数値は通常、Long型となります。

> chr(33457)  '"こ"
> という風になるのですが^^
『Debug.Print TypeName(33457)』を試してみるとわかるかと思いますが、
33457はLong型です。

Chr関数は、16bit(2バイト)の整数値を受け取り、対応する文字を1つ返します。
この時、受け取る整数値は、本来の仕様から言えば、
符号付き16bit整数なら -32768〜32767、
符号無し整数なら 0〜65535という範囲になるはずです。

しかし、VBには「符号無し16bit整数」がありませんから、この場合は
「符号付き32bit整数で、-32768〜65535の範囲」が利用されています。

> これはありうるのですか?
Hex(CLng("33457")) と Hex(CInt("-32079")) は、いずれも
"82B1" という値ですから、ごく正常な動作ですよ。

Option Explicit

Private Sub Command1_Click()
    Dim I1 As Integer, I2 As Integer
    Dim L1 As Long, L2 As Long
    Dim S1 As String, S2 As String

    'Integer型のまま16進数表現にして、
    'それをInteger型の値に戻す場合
    I1 = Asc("こ")
    S1 = Hex(I1)
    S2 = "&H" & S1
    I2 = CInt(S2)
    Test I2
    
    'Integer型のまま16進数表現にして、
    'それをLong型の値に戻す場合
    I1 = Asc("こ")
    S1 = Hex(I1)
    S2 = "&H" & S1
    L2 = CLng(S2)
    Test L2

    'Long型に変換してから16進数表現にして、
    'それをLong型の値に戻す場合
    I1 = Asc("こ")
    L1 = CLng(I1)
    S1 = Hex(L1)
    S2 = "&H" & S1
    L2 = CLng(S2)
    Test L2
End Sub

Private Sub Test(ByVal Value As Variant)
    Dim S As String
    
    S = TypeName(Value) & "の「" & CStr(Value) & "」は、"
    S = S & "Chr関数に渡すと『" & Chr(Value) & "』になります。"
    
    MsgBox S, vbInformation
End Sub

http://www10.ocn.ne.jp/~godspeed/downloads.htm
> UPしたので試してみてください。
……って、どれの事でしょう? (;_;)
# 「暗号機」かな。。。


魔界の仮面弁士  2003-07-13 02:48:55  No: 107770

おっと。.NETだったのですね。失礼しました。
まぁ、.NETでも基本概念は一緒です。データ型に気を付けてみてください。

Dim chrChar As System.Char = "こ"c
Dim intChar As System.Int32 = Microsoft.VisualBasic.Asc(chrChar)
Dim shtChar As System.Int16 = CType(intChar, System.Int16)
Dim S1, S2, S3, S4 As System.String

S1 = System.Convert.ToString(intChar, 16)
S2 = System.Convert.ToString(shtChar, 16)
S3 = Microsoft.VisualBasic.Hex(intChar)
S4 = Microsoft.VisualBasic.Hex(shtChar)

System.Diagnostics.Trace.WriteLine(S1)
System.Diagnostics.Trace.WriteLine(S2)
System.Diagnostics.Trace.WriteLine(S3)
System.Diagnostics.Trace.WriteLine(S4)


godspeed  2003-07-14 09:58:15  No: 107771

CharCode に設定できる値の範囲は非対称であり、短整数型 (Short) と整数型 (Integer) の間にあるストレージ範囲の違いがこれによって吸収されます。たとえば、&H8E01 は Short では -29183 ですが Integer では +36353 です。これにより、Visual Basic 6.0 との互換性も容易になります。

MSDNにこんなことが書いてありましたTT...
魔界の仮面弁士のおかげでなんとなく理解できたような^^
16進数にして戻したときにオーバーフローしたためとっさint32にしちゃったみたいで・・いろいろ勉強になりました!!

VB6.0でやっと慣れてきてmsdn見ながら問題解決できるようになったとたんこれだから・・・.
netの名前空間がーー魔界の仮面弁士はすごいなー自分文字列操作のRIGHT()見つけるのに小一時間かかりましたわーこれまじで^^

遅くなりましたが、貴重な時間を割いていただきありがとうございました。^^


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

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






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