tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル64Bitの整数値を32Bitずつにしたい
記事No2819
投稿日: 2005/12/27(Tue) 16:01
投稿者いっしゃん
[OSのVer]:Windows    [VBのVer]:VB.NET  

掲題の様な感じの処理をしたいのですが、
(64BitLong型→32BitInteger型(上位32Bit、下位32Bit))
なにかうまい方法はないでしょうか?
初歩的なことかも知れませんが、本気でわかりません。(汗
教えて君にはなりたくはないのですが、
すいませんが、誰か教えて下さい。
宜しくお願いします。

[ツリー表示へ]
タイトルRe: 64Bitの整数値を32Bitずつにしたい
記事No2820
投稿日: 2005/12/27(Tue) 16:43
投稿者なおこ(・∀・)
お世話になります。

こういうことでしょうか。
Dim lngValue As Int64 = 2147483647  'Long
Dim intValue As Int32               'Integer
Try
  intValue = Int32.Parse(lngValue.ToString)
Catch ex As OverflowException
  Trace.WriteLine(lngValue.ToString + " は Int32 にキャストできないですよ")
End Try

[ツリー表示へ]
タイトルRe^2: 64Bitの整数値を32Bitずつにしたい
記事No2821
投稿日: 2005/12/27(Tue) 17:48
投稿者いっしゃん
[OSのVer]:Windows    [VBのVer]:VB.NET  
お世話になります。
なおこさん早速の回答ありがとうございます。
えっと、私の説明の仕方が悪かったのかもしれません。
ごめんなさい。
実際、Long型64Bitの整数値には、2147483647以上の値が入ります。
(なので、Int32にはそのままキャストできないのです。)

実はFiletime(64Bit)を取得し、別の機器へ送信するために
32BitのInt型の変数2つ(上位32bit、下位32bit)へ分ける必要があるため、
ここでお聞きしたのです・・・。
う〜。うまく説明できない自分がツラい。

[ツリー表示へ]
タイトルRe^3: 64Bitの整数値を32Bitずつにしたい
記事No2822
投稿日: 2005/12/27(Tue) 18:40
投稿者なおこ(・∀・)
お世話になります。

> 実はFiletime(64Bit)を取得し、別の機器へ送信するために
> 32BitのInt型の変数2つ(上位32bit、下位32bit)へ分ける必要があるため、

FileTime とは↓こちらの事でしょうか。
[FILETIME 構造体]
hhttp://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vclib/html/_mfc_filetime_structure.asp

hhttp://www.pinvoke.net/default.aspx/Structures/FILETIME.html

[ツリー表示へ]
タイトルRe^4: 64Bitの整数値を32Bitずつにしたい
記事No2826
投稿日: 2005/12/28(Wed) 19:55
投稿者いっしゃん
[OSのVer]:Windows    [VBのVer]:VB.NET  
返事遅くなりすいません。

-なおこ様-
FILETIMEはご指摘の通りです。
ただ、今回しようとしている事は、現在時間を
PCから取得し、FILETIMEへ変換していますので
Long型の値になってしまうのです。
(下方にコード書きました。ご参照下さい)

またしても、私の説明不足(ミス)のため、
余計にお手数おかけしまして、本当にすいません。
また、貴重なお時間をお使い頂きまして
誠にありがとうございます。

-魔界の仮面弁士様-
ご回答ありがとうございます。
参考にさせて頂きます。



今の所、とりあえず取得したLong値を2の32乗で割ってみるという
ちからわざでなんとか動かしております。

-以下、コード-
Dim WTime As System.DateTime
Dim m_WTime As Long
Dim TimeStamp As FILETIME

WTime = System.DateTime.Now
m_WTime = WTime.ToFileTimeUtc()
Try
  TimeStamp.dwHighDateTime = m_WTime / (2 ^ 32)
  TimeStamp.dwLowDateTime = m_WTime - (TimeStamp.dwHighDateTime * (2 ^ 32))
Catch e As Exception
 MsgBox(e.ToString)
  Exit Sub
End Try
-以上。-

[ツリー表示へ]
タイトルRe^3: 64Bitの整数値を32Bitずつにしたい
記事No2823
投稿日: 2005/12/28(Wed) 10:05
投稿者魔界の仮面弁士
> 実際、Long型64Bitの整数値には、2147483647以上の値が入ります。
> (なので、Int32にはそのままキャストできないのです。)

とりあえずは、
  Dim L As Long = &HFEDCBA9876543210L
  Dim B() As Byte = BitConverter.GetBytes(L)
  Dim I1 As Integer = BitConverter.ToInt32(B, 0)
  Dim I2 As Integer = BitConverter.ToInt32(B, 4)
  MessageBox.Show(String.Format("&H{0:X8}, &H{1:X8}", I1, I2))
とか。

あるいは、
  Dim L As Long = &HFEDCBA9876543210L
  Dim I1, I2 As Integer

  Dim S As New IO.MemoryStream(64)
  With New IO.BinaryWriter(S)
    .Write(L)
  End With
  S.Position = 0
  With New IO.BinaryReader(S)
    I1 = .ReadInt32()
    I2 = .ReadInt32()
  End With
  S.Close()

  MessageBox.Show(String.Format("&H{0:X8}, &H{1:X8}", I1, I2))
とか。

[ツリー表示へ]