ここから質問投稿すると、最大4000ポイント当たる!!!! >>

あるパスワードをテキストファイルに書き込む処理です。
そのままだと、パスワードの意味が無いので、上位4ビットと下位4ビットを入れ替えて保存しようと思います。
上位・下位それぞれ4ビットシフトするところまでは出来ました。

 Dim a As Integer
 Dim a1 As Integer
 Dim a2 As Integer
 a = Asc("a")
 a1 = a \ 2 ^ 4
 a2 = a * 2 ^ 4
 MsgBox (Hex(a1))
 MsgBox (Hex(a2))

が、それを8ビットに戻す方法が分かりません。
また、パスワードは1バイト文字による文字列ですが、文字列長分を1バイトずつバッファに読み込んで、変換し、同サイズのバッファに詰め込んでいく処理も分かりません。
以前、MS-C(MSDOS上のC言語)を少しやったので、それでなら分かるのですが、VBは全くの初心者で、調べても調べても見当がつきません。
どうか教えて下さい。
宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

●1バイト文字の上位4ビット・下位4ビットの入れ替え


参考。理解・確認のため余分なものを入れている。
骨子は*****のところ。
Sub test01()
h = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", _
"9", "A", "B", "C", "D", "E", "F")
a = Asc("z")
MsgBox "コード" & a
x = a Mod 16 '*****
y = Int(a / 16) '*****
MsgBox "16進表示" & h(x) & " " & h(y)
'もとの数のビット列
s = ""
x = a
For i = 1 To 8
y = x Mod 2
s = y & s
x = Int(x / 2)
Next i
MsgBox "もとの数のビット列" & s
'----
'上位・下位4ビット反転
x = a Mod 16
y = Int(a / 16)
z = x * 16 + y '*****
MsgBox "上位・下位4ビット反転のコード" & z
x = z Mod 16
y = Int(z / 16)
MsgBox "16進表示" & h(x) & " " & h(y)
'------上位・下位4ビット反転のビット列
s = ""
x = z
For i = 1 To 8
y = x Mod 2
s = y & s
x = Int(x / 2)
Next i
MsgBox "上位・下位4ビット反転" & s
End Sub
●文字列長分を1バイトずつバッファに読み込んで、変換し、同サイズのバッファに詰め込んでいく処理も分かりません
上記でもやってますが、
S=""
For i=1 to 文字列長
Xには1バイト分上位・下位4ビット反転した結果を入れる
S=S & X
Next i
を使えば良いです。
下位桁から処理なら
S= X & S
にする。
    • good
    • 0

Private Sub Form_Click()


Dim a As Byte
Dim b As Byte
Dim i As Integer
For i = 0 To &HFF
a = i
b = (a And &HF) * &H10 Or (a And &HF0) \ &H10
Debug.Print Hex(a), Hex(b)
Next
End Sub
    • good
    • 0

>文字列長分を1バイトずつバッファに読み込んで、変換し、同サイズのバッファに詰め込んでいく処理


for i=1 to len(strbuff)
Mid(strbuff, i, 1) = 変換(Mid(strbuff, i, 1))
Next
next
    • good
    • 0

> それを8ビットに戻す方法が分かりません。



文字→8ビットは、
 a = Asc("a")

で出来ていますね。
Asc関数をヘルプで調べると、関連項目にChrという関数がありますので、こちらを利用します。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCELでの16進数取り出し、上位桁と下位桁取り

恐れ入ります。詳しい方教えてください。

各セルに2000までの数値があるデータがあり、このデータを16進数表記で、上位2桁と下位2桁に分けたいと考えています。

例)
870  → &h03, &h66 (870は10進数で366が16進数、これを&hを付けて03と66に分けたい)
1926 → &h07, &h86 

="0x"&DEC2HEX(C4, 4)を使って16進数4桁にすることまでは調べたのですが、上位2桁、下位2桁に分けられず悩んでいます。

Aベストアンサー

いくつか方法はあるでしょうが、
A1に870があるとして
4桁固定でいいなら
上位2桁
=LEFT(DEC2HEX($A1,4),2)
下位2桁
=RIGHT(DEC2HEX($A1,4),2)

Q上位ビットと下位ビットの入れかえ

 2進32桁(0-31桁)の整数値の0桁目と31桁目、1桁目と30桁目、...、15桁目と16桁目を交換した値を求めたいのですが、うまい方法はありませんか。(ソーティングのためのテストデータの生成に使おうとしています。)

Aベストアンサー

自分で書いてはいませんが,
Doukaku.orgのソースコードは参考になりますか?
(Posted feedbacksから言語を選んでください。)

http://ja.doukaku.org/61/

QVisual Basic でのコードをASCII変換、16進変換したものを元に戻す方法を教えてください

string(9)のエリア"Aa1アあa "の文字を1文字ずつASCII変換して、16進変換し、string(18)のエリアに格納します
すると"416131B182A08281202020"と変換されます
(一文字ずつ Hex(Asc(Buf))を使用しました)

逆に、"416131B182A08281202020"を"Aa1アあa "に戻したいのですが、
どのような関数を使えばよいのかわかりません。
困っています。教えてください。よろしくお願いいたします。

Aベストアンサー

VB既存の関数ではできないと思うので、自分で関数を作るなりしてください。

ヒントです。
ASC関数により変換された2バイト文字(シフトJIS)の1バイト目は81~9FおよびE0~FC(すべて16進)になります。
16進数から10進数に戻すには、頭に"&H"をつけます。(&H82A0 = 「あ」のシフトJISコード)
文字を数字に変換するのはVal関数、数字(文字コード)から文字に変換するのはChr関数です。

Q16進数を10進数に変換する方法...

お初にお目にかかります(^^)
簡潔に質問しますm(_ _)m

バージョン:MS-Visual Basic6.0
質問内容:
16進数を10進数に変換する方法がわかりません。
Hex(Text1.Text) や Oct(Text1.Text) のような方法で
16進数・8進数に変換できるんですが…
10進数に変換する方法がわかりません。

P.S できれば、16進数→10進数、16進数や10進数→2進数
…に、変換する方法も、よろしければ教えてくださいませ
m(_ _)m

Aベストアンサー

16進数→10進数は

Dim StrHex As String
Dim intVal As Integer
StrHex = "1A"
intVal = Val("&H" & StrHex)

で出来ます。


申し訳ありませんが2進数への変換はよく分かりません。

QC# シリアル通信でデータ受信時の欠損について

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

--------------------------------------------------------------------------------------
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bytesRead = 0;
// Initialize a buffer to hold the received data
byte[] buffer = new byte[this.serialPort.ReadBufferSize];

try
{
bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
if (true == serialPort.IsOpen)
{
serialPort.DiscardInBuffer();//受信バッファをクリアする
}

}
catch (Exception ex)
{
DataLog.Exception(ex);
}

//派生クラス用の処理
DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
DeviceClassEvent(this, _DeviceClassEventArgs);
}
--------------------------------------------------------------------------------------

ネットの情報を参考に、
ReceivedBytesThreshold の値を期待するデータ量に逐一変えることで
とりあえず正常に取ることが出来たのですが、これでいいのでしょうか?
期待するデータ量がわからなかった場合は使えないのかなとも思います。

データが欠損してしまう理由、
上記の対処法以外の一般的な対処法など有りましたら教えて下さい。

その他参考になるページ等ありましたら教えていただけると大変助かります。

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

-------------------------------------------------------------------------------...続きを読む

Aベストアンサー

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
    //if (true == serialPort.IsOpen)
    //{
    // serialPort.DiscardInBuffer();//受信バッファをクリアする
    //}

    // 受信バッファにデータがなくなるまで繰り返し読込む
    while (true)
    {
      if (0 == serialPort.BytesToRead)
      {
        break;
      }
      buffer[bytesRead] = (byte)serialPort.ReadByte();
      bytesRead++;
      System.Threading.Thread.Sleep(0);

      // シリアルポートの受信バッファには、
      // ・必要なブロックの途中から受信している。
      // ・次のブロックの先頭部分も受信されている。
      // 可能性があるので、ここで必要なブロックだけRead()できたことを確認する。
      if (必要なブロックが正常に読めたか確認する関数())
      {
        break;
      }
    }
  }
  catch (Exception ex)
  {
    DataLog.Exception(ex);
  }

  //派生クラス用の処理
  DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
  DeviceClassEvent(this, _DeviceClassEventArgs);
}

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Le...続きを読む

QVBA2005 16進を2桁で表示したい。

タイトル通りなのですが、

If shtDiff > 1 Then
intNumber = intNumber + 1
ElseIf shtDiff < 1 Then
intNumber = intNumber - 1
End If

intNumberの所に-1が入っているのを確認した後、
strNumber = Format(Hex(intNumber), "00")
とすると表記が"00"になります。
恐らくここの書き方が悪いのだと思うのですが、
Hex(number)だけだと
-1が"FFFF"
-2が"FFFE"になっているのは確認できたのですが、、、
Mid(number,1,2)としても良いのですが、もっとスムーズな方法がありましたら、教えてください!

Aベストアンサー

基本的に HEXステートメントは16進数値を返しますが、桁数を揃える機能はありません。

なので1~15であれば HEX(10) などとすると A のように一桁で帰ってきてしまいますし、257以上の数値を入れれば3桁になります。

またHEXステートメントで返されるのは文字列(正確にはバリアント型)なので、FORMAT文では正常にフォーマットする事は出来ません。

従って常に二桁に桁数を揃えるのであれば
RIGHT("0" & HEX(intNumber),2)
とかきます。4桁であれば RIGHT("000" & HEX(intNumber),4)です。


なお例題の Format(Hex(intNumber), "00") ですと、10~15の値は一桁にしかなりません。

この書き方で二桁になっている様に見えるのは、

HEX(intNum)→0~FFFFの文字列(バリアント型)を返す → A~Fが含まれていない場合は数値として扱えるので、数値に暗黙のキャストをする → FORMATで桁数を合わせる

という流れになっているからです。

従いましてA~Fが含まれている場合は文字列扱いなので、FORMAT文はきいていないことになります。

ただ私はVBA2005で確認した訳ではないのですが、VB系の動作ですと -1 をその書式で実行すると普通はFFFFと返ってくる気がしますね……。

さてVBのiniで表現出来る値は16ビットです。

従いまして -1 を記載した場合 ビット表記すると 1111111111111111 …… という訳で FFFFになります。

これを強制的に二桁に合わせてしまうとFF ですが、これですと255(FF)との区別がつきません。

従いましてマイナスを表記するなら最低4桁にする必要があります。

以上です。

基本的に HEXステートメントは16進数値を返しますが、桁数を揃える機能はありません。

なので1~15であれば HEX(10) などとすると A のように一桁で帰ってきてしまいますし、257以上の数値を入れれば3桁になります。

またHEXステートメントで返されるのは文字列(正確にはバリアント型)なので、FORMAT文では正常にフォーマットする事は出来ません。

従って常に二桁に桁数を揃えるのであれば
RIGHT("0" & HEX(intNumber),2)
とかきます。4桁であれば RIGHT("000" & HEX(intNumber),4)です。


...続きを読む

Qbyte型をstring型として扱うには

今日の質問/マイページに反映されないので、再度の質問です。
windows2000-sp4/vb6-sp5環境です。ユニコードのデータをvbで直接入出力し、vb内でstring型で扱いたいとおもっています。今のところ、vbの入出力では、自動的にsjis/unicode変換がされるので、binaryで受け取り、string型にするのかなと思っています。byte型で受け取り、APIの"MoveMemory"("RtlMoveMemory")でstring型にcopyするのかなとは思っているのですが、うまくいきません。経験不足そのものです。vbでのbyte型とstring型双方向のbinaryな変換の方法をお教えください。

Aベストアンサー

dim s as string
dim b() as byte

'文字列 -> byte配列
b = s

'byte配列 -> 文字列
s = b

Qint型(2バイト)データの分割

int型(2バイト)データの分割

マイコンのフラッシュ領域にint型のデータ(2バイト)を
1バイトづつ書き込むのに以下のコードを考えています。

unsigned int data;
unsigned char dat1,dat2;

data = 555;
dat1 = 0;
dat2 = 0;

dat1 = (char)data;
dat2 = (char)data >> 8;

以下、dat1とdat2をフラッシュに書き込む。

未熟者でプログラムとして合っているのか解りません。
やり方として問題ないでしょうか?
またもっと良い方法があればご教授願います。

Aベストアンサー

まず考えるべきは、フラッシュメモリの書き込んだデータは誰が使うのか? です。

自分(というか、そのシステム)だけでしか使わないのであれば、余り気にすることはありません。

この場合だと、

data = 555; に対して、

dat1 = data % 0x100;
dat2 = data / 0x100;

が一番安全でしょう。
右辺はいずれも int のサイズで計算されて、代入の際に、(数値として)下の桁から、char 分が代入されます。
※代入の直前までは、int で計算されることに注意。

読み出しの場合は、

data = dat2 * 0x100 + dat1;

で安全に元に戻せます。
(これも、0x100 が int 幅なので、 dat2 * 0x100 は int に拡張され、それに対して、int に拡張された dat1 が加算されます)

すべて符号無しなので、char -> int への拡張も問題なく行われます。

あと、かけ算や割り算は効率が悪いのではないか? という心配も無用です。
0x100 のような、(2進数で)きりの良い数のかけ算や割り算は、普通のコンパイラは、内部でシフトに置き換えますので。

まず考えるべきは、フラッシュメモリの書き込んだデータは誰が使うのか? です。

自分(というか、そのシステム)だけでしか使わないのであれば、余り気にすることはありません。

この場合だと、

data = 555; に対して、

dat1 = data % 0x100;
dat2 = data / 0x100;

が一番安全でしょう。
右辺はいずれも int のサイズで計算されて、代入の際に、(数値として)下の桁から、char 分が代入されます。
※代入の直前までは、int で計算されることに注意。

読み出しの場合は、

data = dat2 * 0x100 + dat1;

で...続きを読む

Q16進数の変換処理

VisualBasic6.0で
Val("&H" & "F")
を実行すると、15

Val("&H" & "FF")
を実行すると、255

Val("&H" & "FFF")
を実行すると、4095

Val("&H" & "FFFF")
を実行すると、-1

Val("&H" & "FFFFF")
を実行すると、1048575

という結果が得られます。

なぜ”FFFF”の時に”-1”が返ってくるのでしょうか?
また、どうやったら、
”FFFF”から”65535”が得られるのでしょうか?

教えてください。
よろしくお願いします。

Aベストアンサー

VAL関数
指定した文字列に含まれる数値を適切なデータ型に変換して返します。

FFFFは、INT型で扱える最大値なのでINT型と判定されます。
cint("&H"+"FFFF")だと、-1が返ります。
FFFFFは、INTの扱える値を超えたのでLONG型で判定される為に1048575と言う結果になるのです。
では、なぜマイナスになるのか?
FFFFを2進数で表すと以下のようになりますね。
11111111 11111111 11111111 11111111
↑先頭の1バイト目が1だとマイナスとして扱われます。

以上です。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。


人気Q&Aランキング