godspeedと申します。いきなりですが。
Asc("こ") '-32079
Hex(-32079) 'FFFF82B1
このFFFFをカットして82B1として扱います。
"&H" + 82B1 '33457
chr(33457) '"こ"
という風になるのですが^^
これはありうるのですか?
http://www10.ocn.ne.jp/~godspeed/downloads.htm
UPしたので試してみてください。ソースはUPしてませんが。
このやり方で変換しています。
データ型を間違えているのでは無いでしょうか。
「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したので試してみてください。
……って、どれの事でしょう? (;_;)
# 「暗号機」かな。。。
おっと。.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)
CharCode に設定できる値の範囲は非対称であり、短整数型 (Short) と整数型 (Integer) の間にあるストレージ範囲の違いがこれによって吸収されます。たとえば、&H8E01 は Short では -29183 ですが Integer では +36353 です。これにより、Visual Basic 6.0 との互換性も容易になります。
MSDNにこんなことが書いてありましたTT...
魔界の仮面弁士のおかげでなんとなく理解できたような^^
16進数にして戻したときにオーバーフローしたためとっさint32にしちゃったみたいで・・いろいろ勉強になりました!!
VB6.0でやっと慣れてきてmsdn見ながら問題解決できるようになったとたんこれだから・・・.
netの名前空間がーー魔界の仮面弁士はすごいなー自分文字列操作のRIGHT()見つけるのに小一時間かかりましたわーこれまじで^^
遅くなりましたが、貴重な時間を割いていただきありがとうございました。^^
ツイート | ![]() |