tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルchr(&H82)をUDPで送ると&H00になる(Winsock)
記事No15637
投稿日: 2013/02/09(Sat) 00:02
投稿者ぷー
はじめまして。知恵をお貸しください。
下のような感じでソフトを組んでUDPでコマンドを送っています。
コマンドの実行状態がおかしかったので、Wiresharkで送信パケット?を調べると
Chr(&H82)の部分だけ「00」となって送信されています。

Q1.どうすれば&H82の部分を正常に送信できるようになるのでしょうか・・・
Q2.現在送信文字列(result)をforで回していますが、
  他に何かスマートな方法は無いでしょうか?

環境:VB6,WindowsXP(SP2),

Private sub cmd_Click()
 
 dim cmnd(20) as string
  dim result as string
  dim iCount as integer  

 'ポートオープン
 With Winsock
   .close
   .Protocol = sckUDPProtocol
   .RemoteHost = "192.168.1.2"
   .RemotePort = 9600
   .Bind 10000
  End with

 'コマンド準備
 cmnd(0) = chr(&H80)
 cmnd(1) = chr(&H00)
 cmnd(2) = chr(&H02)
 cmnd(3) = chr(&H00)
 cmnd(4) = chr(&H32)
 cmnd(5) = chr(&H82)   '←これだけ化ける
 
  for iCount = 0 to 5 
    result = cmnd(iCount) & result  
  next 

  Winsock.senddata result  'コマンド送信

end sub

実際はcmnd(x)の部分が長々と続くのですが…、
これを実行すると「80 00 02 00 32 82」と送信して欲しい所が
「80 00 02 00 32 00」と送信されています。

[ツリー表示へ]
タイトルRe: chr(&H82)をUDPで送ると&H00になる(Winsock)
記事No15638
投稿日: 2013/02/09(Sat) 03:31
投稿者魔界の仮面弁士
> コマンドの実行状態がおかしかったので、Wiresharkで送信パケット?を調べると
> Chr(&H82)の部分だけ「00」となって送信されています。
Chr 関数は、「文字」の送信のために使います。
&H82 の文字はありえないため、データは破損してしまうでしょう。


> Q1.どうすれば&H82の部分を正常に送信できるようになるのでしょうか・・・
String ではなく、Byte 配列を送出してください。

http://support.microsoft.com/kb/411403/ja
http://www.cs.k.tsukuba-tech.ac.jp/labo/koba/software/winsock.html


String で渡した場合、それらは ANSI 文字に変換されて送られるため、
データによっては、化けたり欠けたりといった現象が起きることがありますが、
バイナリとして送った場合には、そうした加工が施されずに送出されます。


> Q2.現在送信文字列(result)をforで回していますが、
>  他に何かスマートな方法は無いでしょうか?
下記のような関数を用意しておくと、
 Dim bin() As Byte
 bin = HexStringToBinary("800002003282")
とするだけで、
 bin(0) = &H80
 bin(1) = &H00
 bin(2) = &H02
 bin(3) = &H00
 bin(4) = &H32
 bin(5) = &H82
を作りこめます。


Public Function BinaryToHexString(ByRef Binary() As Byte) As String
    With CreateObject("Microsoft.XMLDOM").createElement("e")
        .DataType = "bin.hex"
        .NodeTypedValue = Binary
        BinaryToHexString = .Text
    End With
End Function

Public Function HexStringToBinary(ByVal Text As String) As Byte()
    With CreateObject("Microsoft.XMLDOM").createElement("e")
        .DataType = "bin.hex"
        .Text = Text
        HexStringToBinary = .NodeTypedValue
    End With
End Function

[ツリー表示へ]
タイトルRe: chr(&H82)をUDPで送ると&H00になる(Winsock)【解決】
記事No15639
投稿日: 2013/02/09(Sat) 21:46
投稿者ぷー
返事遅くなって申し訳ありません。

魔界の仮面弁士さん、回答ありがとうございます。
いつもながら引き出しの多さに驚いております。

プログラムは週明けに試してみます。ありがとうございました。

[ツリー表示へ]