• ベストアンサー

バイト型のデータをLong型に変換

初歩的なことですみません。 Dim a(0 to 3) as Byte Dim b as Long と宣言します。 この変数aをLong型のbに変換するにはどのように したらよいのでしょうか? 逆にbの値をaに変換する方法もできましたらお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

色々な方法があります。 (1)論理演算子 a(0) = b And &HFF# a(1) = (b And &HFF00#) / &H100# a(2) = (b And &HFF0000#) / &H10000# a(3) = (b And &H7F000000#) / &H1000000# If (b And &H8000000) Then a(3) = (a(3) Or &H80) End If (2)ファイル Open "temp.tmp" For Binary As #1 Put #1, 1, b Get #1, 1, a Close #1 (3)RtlMoveMemory Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long) MoveMemory a(0), b, 4 MoveMemory b, a(0), 4 -- (2)が手堅く応用が利くかと。 (3)はlongならいいが、4の倍数でない型は問題あるかも。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

前半は、簡単に Sub main() Dim a As Byte Dim b As Long x = Asc(a) MsgBox x b = CLng(x) MsgBox b End Sub は間違ってますか。 自信ありませんので、ご存知の方教えてください。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 変換規則を具体例付きで提示して下さい。 a(0)~a(3)がどのような値の時、bにどのように変換された値が入るのか? または、bがどのような値の時、a(0)~a(3)はどのような値に変換されるのか? ひょっとして、256進数のようなことでしょうか? a(0)が1つ目の位、a(1)が2つ目の位という感じで。 でもその場合は、いくらByteが1バイト、Longが4バイトであっても、数値の範囲が、 Byte:0~255の"正の整数" Long:-2,147,483,648 ~ 2,147,483,647の整数 なので、まともには無理ですが。

関連するQ&A

  • EXCEL VBA Byte型に"0"を付けたい

    EXCEL VBAにてあるセルの値をByte型の16進数に 変換していますが、変換後の値の頭に"0"が付かなくて 困っています。 Dim a As String Dim aa As String Dim b As Byte Dim bb As Byte a = Val("&H" & Cells(1, 1)) aa = Format(a, "00") b = aa bb = Format(b, "00") 変数など簡略化していますが、こんな感じです。 最後の"bb"の中身が、例えば"01"ではなく"1"と なってしまっています。 バイナリエディタで表示した時に、"111"ではなく "010101"と表示させたいのですが、、、 この方法にこだわっている訳ではないので 他の方法も含めて、ご教示お願いします。

  • VB2005でバイト配列をコピーするには

    どなたかご教授下さい。 VB6で作成したプログラムをVB2005にコンバートしました。構造体からなる配列変数を一つの配列変数にコピー したいのですが、構造体の最初のメンバーだけ値が同じで以降の値は正しくセットされていませんでした。 どのように記述したらよいのでしょうか。またCopymMemory以外で良い方法があればご教授下さい。 よろしくお願い致します。 ===概略=== Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Byte, ByRef Source As Byte, ByVal Length As Short) 構造体定義 (コピー元) <StructLayout(LayoutKind.Sequential)>Structure ST_MOTO <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim byte_strTranCd() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Dim byte_strTanSeq() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim byte_strTxtNo() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim byte_strTxtSeq() As Byte End Structure Dim A As ST_MOTO (コピー先) <StructLayout(LayoutKind.Sequential)> Structure ST_SAKI Dim lngrecLen As Integer 'データのLength <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Dim bytrecData() As Byte 'データ End Structure Dim B As ST_SAKI Call CopyMemory(B.bytrecData(0), A.byte_strTranCd(0), 14) 出力結果 '最初の構造体のメンバーの値は正しく設定されている B.bytrecData(0) =80    A.byte_strTranCd(0) =80 B.bytrecData(1) =50    A.byte_strTranCd(1) =50 B.bytrecData(2) =57    A.byte_strTranCd(2) =57 B.bytrecData(3) =50    A.byte_strTranCd(3) =50 'これ以降は正しくない。(VB6だと正しく設定されている) B.bytrecData(4) =0     A.byte_strTanSeq(0) =80 B.bytrecData(5) =0     A.byte_strTanSeq(1) =87 B.bytrecData(6) =0     A.byte_strTanSeq(2) =48 B.bytrecData(7) =0     A.byte_strTanSeq(3) =48 B.bytrecData(8) =6     A.byte_strTanSeq(4) =55     ・              ・     ・              ・

  • データ型変換

    String型のデータをInteger型の変数に入れたいのでが・・・。 '変数の宣言 Dim DataTable(2, 5) As String Dim made As Integer 'データ型変換 made = CInt(DataTable(1, 0)) このようにしたのですが、実行すると 『実行時エラー '13'  型が一致しません』 と表示され、デバックしてみるとココ↓ made = CInt(DataTable(1, 0)) が黄色くなります。 どうしたら上手く型変換ができるのでしょうか? ちなみに、VB6.0です。

  • 変数から命令?

    例えば dim a as String a="dim b as Long" という風にしてみて aの値に入ってるやつを実行(?)するようなことができますか? つまり、ここでいうなら aに"dim b as Long"をいれて なんらかの処理を行って 変数bを作成することはできますか?

  • この型変換の内容がわかりません(LSet)

    こんにちわ。以下のプログラムを解読しているのですが、型変換がどう行われているのかがわからなくて困っています。 『←ココ!!』となっているところの型変換です。PのLong型をByte型へ変換しているとは思うのですが、内容をみるとどうなってそうなったのかわからないのです。『←ココ!!』の後の値を見てみると、 bP.bP(3)は「0」 bP.bP(2)は「188」 bP.bP(1)は「97」 bP.bP(0)は「78」 となっています。LSetで「P:12345678」がどうなってこうなったのでしょうか? 教えていただけるとうれしいです。宜しくお願いしまっす。 ***プログラム*** ’宣言 Const P As Long =12345678 Private Type bytP bP(3) As Byte End Type Private Type lngP lP As Long End Type Dim bytB(4) As Byte ’mainの中 lP.lP = P LSet bP = lP 『←ココ!!』 bytB(0) = bP.bP(3) bytB(1) = bP.bP(2) bytB(2) = bP.bP(1) bytB(3) = bP.bP(0) ******************

  • C言語signed long long型の演算

    C言語で以下の演算を行った場合、変数bに格納される値が-1(0xFFFFFFFFFFFFFFFF)になることを期待しておりましたが、参照すると4294967295(0x00000000FFFFFFFF)となってしまいます。 unsigned int a = 1; signed long long b; b = a * (-1); 32bit、64bitのUNIX(Solaris)マシンでそれぞれ確認しましたが、どちらも同じ結果となりました。 変数aの型宣言をsigned intにすると変数bが-1(0xFFFFFFFFFFFFFFFF)になることは確認したのですが、unsigned intだとなぜこのような演算結果となるのかが分かりません。 ※8バイト整数に格納する際に先頭4バイトがなぜ0xFFFFFFFFで補完されないのか? ちなみに変数bの型宣言をsigned long intにすると32bitマシンでは-1となりましたが、64bitマシンでは4294967295となってしまいます。 これは32bitUNIXマシンではsigned long intは4バイト領域であるため-1(0xFFFFFFFF)となり、64bitUNIXマシンでは8バイト領域のため前述と同じ結果になるのだと考えますが、なぜ8バイト整数を使用するとこのような演算が行われるのかが分からないので、演算順序や型変換の優先順位がどのように行われいるのか説明できる方教えてください。

  • 変数の宣言の名称を教えてください。(Dim i As Long)

    Dim i As Longについて 「dim」→? 「i」→変数名 「As」→? 「Long」→変数の型 というように、dimとAsがなんと言えばいいのかわかりません。 アドバイスよろしくお願いします。

  • Excel にて変数の宣言の仕方

    Excel2002を使用しています。 標準モジュール内で下記のように変数を宣言すると Dim i,k as long (例)kには、あるセルの値を取得します。10000 Keta=len(k) この結果、ketaには、「4」という結果になります。 10000なので、「5」が返らないといけないのですが、うまくいきません。 ところが、 Dim i ,k ,m as long このように変数kの後ろに他の変数(今回はm)を記載すると、 「5」という結果が返ってきます。 変数の宣言の仕方が間違っているのでしょうか? よろしくお願いいたします。 ちなみに、 Dim k as long としても、「4」の結果が返ってきました。 同じ行に他の記載をしないとうまくいかないようです。。。

  • VBでの変数宣言は1行に2つできないのですか?

    Visual BASICで変数宣言は1行に2つ以上記述しても実際、動作します。 例 DIM A、B as Integer このように宣言すると、AもBも整数となります。 しかし、このように宣言して、この変数を Call サブプログラム名(B) のように、パラメ-タとして引き渡そうとするとエラーとなってしまうようです。 よくわからないまま、 DIM A as Integer DIM B as Integer と分けて記述したらエラーがきえたようです。 変数宣言は1行に2つ以上まとめて記述してはいけないのでしょうか? VBは Ver 5 です。

  • エクセル VBA 変数を一括で宣言したい

    こんにちは。VBAプログラム初心者です。 変数を宣言する際、 dim オーダ番号 as long, オーダ番号2 as long, …オーダ番号100 as long という内容を一括で宣言することは可能でしょうか? イメージ的には下のような感じなのですが。。。 dim i as integer for i = 1 to 100 dim オーダ番号i as long dim 単価i as long next マクロで便利にするつもりが余計面倒になっていて困っております。 解決策を教えていただけましたら幸いです。 何卒よろしくお願いいたします。

専門家に質問してみよう