C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: ASCコードで受け取るサーバに送信したい


(過去ログ 97 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■58005 / inTopicNo.1)  ASCコードで受け取るサーバに送信したい
  
□投稿者/ コアラ主任 (27回)-(2011/03/23(Wed) 16:23:42)

分類:[VB6 以前] 

VB6SP6 開発環境:XP 実行環境:Win2000

サーバ側がASCコードで受信します。
どうも、送信データの作成に誤りがあるように
思います。
データの作成と送信を以下のように書いたのですが、
うまく受信されていないようなのです。
(「A」をと言うデータを送る時は以下のように
 記述しています。)
何かお気付きの方、ご教示お願い致したく。

-----------------------------------------------------
Dim sdatC As String

sdatC = "&H41"
lngRet = send(mlngSock, ByVal sdatC, Len(sdatC), 0)
-----------------------------------------------------


引用返信 編集キー/
■58006 / inTopicNo.2)  Re[1]: ASCコードで受け取るサーバに送信したい
□投稿者/ shu (537回)-(2011/03/23(Wed) 16:34:12)
No58005 (コアラ主任 さん) に返信

ASCキーコードで送信というのは
文字で送信するなら"A"を送ればいいし
バイナリで送信するなら&H41(byteデータ)を送ればいいのであって
"&H41"という文字列を送ってはいけません。
引用返信 編集キー/
■58016 / inTopicNo.3)  Re[2]: ASCコードで受け取るサーバに送信したい
□投稿者/ コアラ主任 (29回)-(2011/03/23(Wed) 22:36:03)
No58006 (shu さん) に返信
> ■No58005 (コアラ主任 さん) に返信
>
> ASCキーコードで送信というのは
> 文字で送信するなら"A"を送ればいいし
> バイナリで送信するなら&H41(byteデータ)を送ればいいのであって
> "&H41"という文字列を送ってはいけません。

ご返答ありがとうございます。
-----------------------------------------------------
Dim sdatB(10) As byte

sdatB(1) = &H41
lngRet = send(mlngSock, ByVal sdatB, Len(sdatC), 0)
-----------------------------------------------------

と言う事でしょうか・・・。


引用返信 編集キー/
■58017 / inTopicNo.4)  Re[3]: ASCコードで受け取るサーバに送信したい
□投稿者/ shu (540回)-(2011/03/23(Wed) 22:39:07)
No58016 (コアラ主任 さん) に返信

> -----------------------------------------------------
> Dim sdatB(10) As byte
> 
> sdatB(1) = &H41 
> lngRet = send(mlngSock, ByVal sdatB, Len(sdatC), 0)
> -----------------------------------------------------
> 
> と言う事でしょうか・・・。

sdatB(0) = &H41 
      ^
で
Len(sdatC)は1

引用返信 編集キー/
■58020 / inTopicNo.5)  Re[4]: ASCコードで受け取るサーバに送信したい
□投稿者/ コアラ主任 (30回)-(2011/03/23(Wed) 23:17:26)
No58017 (shu さん) に返信
> ■No58016 (コアラ主任 さん) に返信
>
>>-----------------------------------------------------
>>Dim sdatB(10) As byte
>>
>>sdatB(1) = &H41
>>lngRet = send(mlngSock, ByVal sdatB, Len(sdatC), 0)
>>-----------------------------------------------------
>>
>>と言う事でしょうか・・・。
>
> sdatB(0) = &H41
> ^
> で
> Len(sdatC)は1
>

早速のご返答ありがとうございます。
コーディング、コピペミスがありましたが・・・、
複数文字を送信する場合は、
-----------------------------------------------------
Dim sdatB(10) As byte

sdatB(0) = &H41
sdatB(1) = &H42
lngRet = send(mlngSock, ByVal sdatB, 2, 0)
-----------------------------------------------------
という事になるかと思ったのですが、sendのsdatBが
「型が一致しません」とコンパイルエラーになってしまいました。
宣言を見ると第2引数は「buf As Any」となっています。
デバッグをしていただくようで申し訳ありません。
よろしければ、よろしくお願いいたします。

Private Declare Function send Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal lngLenlen As Long, ByVal flags As Long) As Long




引用返信 編集キー/
■58023 / inTopicNo.6)  Re[5]: ASCコードで受け取るサーバに送信したい
□投稿者/ コアラ主任 (31回)-(2011/03/24(Thu) 00:57:27)
No58020 (コアラ主任 さん) に返信
> ■No58017 (shu さん) に返信
>>■No58016 (コアラ主任 さん) に返信
>>
> >>-----------------------------------------------------
> >>Dim sdatB(10) As byte
> >>
> >>sdatB(1) = &H41
> >>lngRet = send(mlngSock, ByVal sdatB, Len(sdatC), 0)
> >>-----------------------------------------------------
> >>
> >>と言う事でしょうか・・・。
>>
>>sdatB(0) = &H41
>> ^
>>で
>>Len(sdatC)は1
>>
>
> 早速のご返答ありがとうございます。
> コーディング、コピペミスがありましたが・・・、
> 複数文字を送信する場合は、
> -----------------------------------------------------
> Dim sdatB(10) As byte
>
> sdatB(0) = &H41
> sdatB(1) = &H42
> lngRet = send(mlngSock, ByVal sdatB, 2, 0)
> -----------------------------------------------------
> という事になるかと思ったのですが、sendのsdatBが
> 「型が一致しません」とコンパイルエラーになってしまいました。
> 宣言を見ると第2引数は「buf As Any」となっています。
> デバッグをしていただくようで申し訳ありません。
> よろしければ、よろしくお願いいたします。
>
> Private Declare Function send Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal lngLenlen As Long, ByVal flags As Long) As Long
>

《自己レス》
---------------------------------------------------------
Dim sdatc As String

sdatc = ChrB(&H41) + ChrB(0) + ChrB(&H42) + ChrB(0)
lngRet = send(mlngSock, ByVal sdatc, 2, 0)
---------------------------------------------------------
テスト環境で行うと「AB」と言うデータを受け取っているのですが、
ASCコードにて受け取る環境では、正しく、解読できるのでしょうか・・・。
(※今、一歩、コードと言うものを理解できていない・・・。)

引用返信 編集キー/
■58026 / inTopicNo.7)  Re[6]: ASCコードで受け取るサーバに送信したい
□投稿者/ shu (541回)-(2011/03/24(Thu) 07:55:11)
No58023 (コアラ主任 さん) に返信

>>Private Declare Function send Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal lngLenlen As Long, ByVal flags As Long) As Long
buf as Any => Byref buf as byte


> Dim sdatB(10) As byte
>
> sdatB(0) = &H41
> sdatB(1) = &H42
> lngRet = send(mlngSock, ByVal sdatB, 2, 0)
send(mlngSock, sdatB(0), 2, 0)

でどうでしょう?



>>
>
> 《自己レス》
> ---------------------------------------------------------
> Dim sdatc As String
>
> sdatc = ChrB(&H41) + ChrB(0) + ChrB(&H42) + ChrB(0)
> lngRet = send(mlngSock, ByVal sdatc, 2, 0)
> ---------------------------------------------------------
> テスト環境で行うと「AB」と言うデータを受け取っているのですが、
> ASCコードにて受け取る環境では、正しく、解読できるのでしょうか・・・。
> (※今、一歩、コードと言うものを理解できていない・・・。)
>
文字列ならこれで2->4にすればいいと思いますが、これだと文字の間にnullが入りますがそういう仕様ですか?


引用返信 編集キー/
■58029 / inTopicNo.8)  Re[7]: ASCコードで受け取るサーバに送信したい
□投稿者/ コアラ主任 (33回)-(2011/03/24(Thu) 09:33:01)
No58026 (shu さん) に返信
> ■No58023 (コアラ主任 さん) に返信
>
> >>Private Declare Function send Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal lngLenlen As Long, ByVal flags As Long) As Long
> buf as Any => Byref buf as byte
>
>
>>Dim sdatB(10) As byte
>>
>>sdatB(0) = &H41
>>sdatB(1) = &H42
>>lngRet = send(mlngSock, ByVal sdatB, 2, 0)
> send(mlngSock, sdatB(0), 2, 0)
>
> でどうでしょう?
>
>
>
> >>
>>
>>《自己レス》
>>---------------------------------------------------------
>>Dim sdatc As String
>>
>>sdatc = ChrB(&H41) + ChrB(0) + ChrB(&H42) + ChrB(0)
>>lngRet = send(mlngSock, ByVal sdatc, 2, 0)
>>---------------------------------------------------------
>>テスト環境で行うと「AB」と言うデータを受け取っているのですが、
>>ASCコードにて受け取る環境では、正しく、解読できるのでしょうか・・・。
>>(※今、一歩、コードと言うものを理解できていない・・・。)
>>
> 文字列ならこれで2->4にすればいいと思いますが、これだと文字の間にnullが入りますがそういう仕様ですか?
>
>

度々のご返答ありがとうございます。

> send(mlngSock, sdatB(0), 2, 0)
>
> でどうでしょう?
はい、ありがとうございました。
テスト環境ですが、「AB」と受信されたのを確認しました。

> 文字列ならこれで2->4にすればいいと思いますが、これだと文字の間にnullが入りますがそういう仕様ですか?
こちらは、平行し、調べていた、とあるページにVBは、バイト型は、文字列で
送信しないといけないと書いてあった一部を見て、そこを参照し、作成してみました。
バイト型を文字列にするの逆の操作を記述しました。
>sdatc = ChrB(&H41) + ChrB(0) + ChrB(&H42) + ChrB(0)
>lngRet = send(mlngSock, ByVal sdatc, 2, 0)
これで、先ほどと同じようにテスト環境で「AB」と受信されているよう
画面上は、見えます。
かつ、送信データ長は、「2」のままです。
逆にchrb(0)を外し、「ChrB(&H41) + ChrB(&H42)」として、送信すると
受信側では「?」と表示されて、受信されています。
そして、Chrb(0)を入れても、画面上には、上記のバイト配列で送信したのと
同じように「AB」と隙間なく、受信されているように見えます。
ASCコードを受け取る環境でも、同じデータして、認識されるのでしょうか・・・。


引用返信 編集キー/
■58078 / inTopicNo.9)  Re[8]: ASCコードで受け取るサーバに送信したい
□投稿者/ Azulean (713回)-(2011/03/24(Thu) 22:53:58)
2011/03/24(Thu) 22:56:53 編集(投稿者)

No58029 (コアラ主任 さん) に返信
> ASCコードを受け取る環境でも、同じデータして、認識されるのでしょうか・・・。

その環境を持ち、実験できる人にしかわかりません。
第三者に「認識されるのでしょうか」と問うたところで、される・されないの回答は不可能です。
本番環境や客先環境と言った事情で、気軽に試せないのなら、試せる環境を作りだしてください。
-----
VB は一応 Unicode 環境なので、ChrB(&H41) & ChrB(&H42) を String 型に入れた時点で別の文字になります。
(UTF-16 においてはアルファベットでも 1 文字を 2 バイトで表す。2 バイトに満たない場合は文字化けて当然です)
「ASC コード」が何を指しているかわかりませんが、ASCII コードなのであれば、ChrB(&H41) & CHrB(&H42) を AB と解釈するのでしょう。(コード表は見直してないので数値の間違いは確認してません)
こういったバイト列を送りつけるのであれば、String 型ではなく、Byte 型配列として渡すようにすべきです。

テスト環境が Byte 配列を受け取ってそのまま String に入れているのであれば、そもそもそのテスト環境自体が間違っている可能性があります。
ASCII で受け取ったデータを String に入れるには Unicode に変換しなければいけないのですから。
引用返信 編集キー/
■58087 / inTopicNo.10)  Re[9]: ASCコードで受け取るサーバに送信したい
□投稿者/ 774RR (584回)-(2011/03/25(Fri) 09:23:23)
String と byte の違いを正しく認識してるのかどうかが不明なのでなんともいえないが
とりあえず以下の項目は理解できているのだろうか?

文字セット:どの文字を使い、どの文字は見捨てるのかの合意
(例:JIS第一水準とか常用漢字とか)
文字コード:(文字セット中にある)特定1文字に割り振るコード
(例:ひらがなの「あ」に対して JIS X 0208 は 004 区 02 点というコードを割り振っている)
符号化方式:文字コードをプログラム上やデータ上で具体的にどう表現するか
(「あ」の 004 区 02 点 というコードを、SHIFT-jis では 0x82A0 と表現し EUC-jp では 0xA4A2 と表現する)

ASC コードというのは俺も知らないのだが、仮に ASCII であるとして。
ASCII は 1960 年代に作られた代物で、上記文字セット・文字コード・符号化方式を
(意識的な区別をせず)同時に含むもの。
A という文字に対して、文字コード=表現方式として 7bit 二進数1000001 を使う。
最近のコンピュータは 7bit データを扱うのが苦手なので、最上位ビットに 0 を補い
8bit のデータ 0x41 として扱うのが普通になっている。

これに対して VB は[文字]として 文字セット:UNICODE 符号化方式:UTF-16 を使う。
VB の String は [文字](の列) を扱うものなので、当然 UTF-16 符号化方式である。
UTF-16 と ASCII では表現方式が違うので変換が必要。

ASCII の 0x41 は UNICODE の U+0041 文字になり、 UTF-16 表現すると 0x0041
ASCII の 0x41 0x42 という [ASCII の文字の列] を
UTF-16 の 0x0041 0x0042 (UNICODE の U+0041 U+0042) と変換するのか
UTF-16 の 0x4142 (UNICODE の U+4142) と変換するのか
UTF-16 の 0x4241 (UNICODE の U+4241) と変換するのか
そういうあたりは常に意識しておかないとバグっちゃうぞ。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -