- PR -

Byte配列のString変換

投稿者投稿内容
くんちん
常連さん
会議室デビュー日: 2002/10/07
投稿数: 46
投稿日時: 2003-03-18 09:37
お世話になっております。
Byte配列のデータ変換でつまづいてなやんでおります。

Dim aaaa(256) as Byte
Dim stra as String

aaaaのバイト配列の中身にちょこちょこ0が入っています。
String型の変数にaaaaの全てのデータを入
れようとすると0が出てきた後からデータが
切られてしまい、全てのデータが取得できません。

色々な事を試したのですが、うまくいきません。
何かいい方法をご存知の方ご教授お願い致します。

くんちん
常連さん
会議室デビュー日: 2002/10/07
投稿数: 46
投稿日時: 2003-03-18 10:06
Dim StrData As String
Dim Bytbuf(256) As Byte

自己レスです。
私が今まで、試した内容です。
StrData = Encoding.Unicode.GetString(Bytbuf)
これも駄目でした。
MultiByteToWideCharを使用しても駄目でした。
CStr関数も駄目で、String関数はなくなってました。

上記以外で、これは?といった意見がありましたら
教えて頂けないでしょうか?
宜しくお願いいたします。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2003-03-18 11:01
0が入っている文字列というのは?
0が入っているのにそこで終わりではないというのは、どんな文字コードの文字列ですか?
くんちん
常連さん
会議室デビュー日: 2002/10/07
投稿数: 46
投稿日時: 2003-03-18 12:02
説明が足りなくて申し訳ありません。
Byte配列には、文字コードのみではなく、数値が入ることもあります。

これはサーバ(Cプログラム)とクライアント(VB.NET)とのデータ送受信でのお話です。
この局面はサーバから受信したデータをクライアントで受け取るときのことです。

たとえば以下のようなデータを送受信するとして
Dim arr(4) As Byte

内容が数値の場合以下のようなデータがサーバ側から入ってきます。
arr(0) = 1(←数値データ)
arr(1) = 0(←データなし)
arr(2) = 1(←数値データ)
arr(3) = 0(←データなし)

本来、SHIFT JIS文字変換をするならば以下のような
arr(0) = 49
arr(1) = 48
arr(2) = 49
arr(3) = 48

文字コードを期待するのですが、サーバ側の仕様で数値の文字コードへの変換処理は
行っておりません。
サーバとクライアントの取り決めになるのでしょうが、一般的に数値としてのByte配列
の扱いはやはり数値型への変換をすることになるのでしょうか。Byte列の扱いを文字だったら
String、数値だったらInteger等へ変換して利用する側の使い勝手を良くしたいというのが
ベースにあるのです。
よろしくお願いします。
へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 2003-03-18 13:00
引用:

Byte列の扱いを文字だったら
String、数値だったらInteger等へ変換して利用する側の使い勝手を良くしたいというのが
ベースにあるのです。


それって、原理上不可能では?
Byteデータが文字コードなのか数値なのかを見分ける方法はありません。値が49だとしても、それが数値の49なのか'1'という文字コードなのか、区別する手段はありません。
サーバとの取り決めで、たとえば「何バイト目から何バイト目は文字コード」としておくなどしないと。
あと、最終的に文字列として出力したいのなら、Byte値から文字コードへの変換は自分でやるしかありません。
コード:
	stra = stra & chr(arr(i))


とかでしょうか。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2003-03-18 14:47
>Byte列の扱いを文字だったらString、数値だったらInteger等へ変換して

ByteはByteデータです。へげもんさんの仰るように、shift-JISの文字コードか数値かはデータからは読み取れませんので、サーバークライアント間のプロトコルにより、そのバイトが文字コードか数値かどちらを表しているか判るものとして話を進めます。
引用:

内容が数値の場合以下のようなデータがサーバ側から入ってきます。
arr(0) = 1(←数値データ)
arr(1) = 0(←データなし)
(略)
SHIFT JIS文字変換をするならば以下のような
arr(0) = 49
arr(1) = 48
(略)

文字だったらString、数値だったらInteger等へ変換して・・・


まずここが分からないのですが、「数値だったらInteger等」なんですよね?
ですが数値を文字列に変えようとするような例が上に出ているので、混乱してしまいます。
それに1バイトの値が一つの数値を表すのですか?例えば4バイトで一つの数値を表すことなどは?
rvmx
大ベテラン
会議室デビュー日: 2002/09/26
投稿数: 184
お住まい・勤務地: 愛媛県
投稿日時: 2003-03-18 22:08
今日は
 引用:----------------------------------------------------------------
  内容が数値の場合以下のようなデータがサーバ側から入ってきます。
  arr(0) = 1(←数値データ)
  arr(1) = 0(←データなし)
  arr(2) = 1(←数値データ)
  arr(3) = 0(←データなし)
 ---------------------------------------------------------------------
普通は文字のバイト配列で0が入るのは、ASC文字をUNICODEにした時、0が追加されます。
其の時は、下記方法で変換できると思うのですが
Dim bt() As Byte = System.Text.Encoding.Unicode.GetBytes("abc")
bt->0x61 0x00 0x62 0x00 0x63 0x00 ゼロが追加されている。
Dim st as String = System.Text.Encoding.Unicode.GetString(bt)
st->"abc"
又、VB.NETでは、VB6のUnicdeへの変換のStrConv("abc",VBUnicode)
と戻すStrconv(chr(&H61)+CHR(0)+CHR(&H62)+CHR(0)+CHR(&H63)+CHR(0),VBFromUnicode)
もつかえると思いますが。

 引用:----------------------------------------------------------------
   私が今まで、試した内容です。
   StrData = Encoding.Unicode.GetString(Bytbuf)
   これも駄目でした。
 ---------------------------------------------------------------------
も試したとの事で、的外れかも知れません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-03-20 09:06
こんにちは。

 否定的な意見が続いていますが、
引用:

利用する側の使い勝手を良くしたいというのがベースにあるのです。


というベースの考えの意味をもう一度考えてみてください。数値/文字列をキチンと判別して使用できるようにする方が、利用する側の使い勝手がよいと思うのですが、いかがでしょうか。


 ところで、このサーバ/クライアントのやりとりは、どのような状況で使おうとされているのでしょうか。OBJECTクラスへの変換は、基底クラスへの変換になるため、元のクラス情報が保持されます。

dim obj as object
dim str as string
dim i as integer

obj = str
obj.gettype.tostring
obj = i
obj.gettype.tostring

などとやってみてください。これは使えませんか?

スキルアップ/キャリアアップ(JOB@IT)