- - PR -
Byte配列のString変換
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-03-18 09:37
お世話になっております。
Byte配列のデータ変換でつまづいてなやんでおります。 Dim aaaa(256) as Byte Dim stra as String aaaaのバイト配列の中身にちょこちょこ0が入っています。 String型の変数にaaaaの全てのデータを入 れようとすると0が出てきた後からデータが 切られてしまい、全てのデータが取得できません。 色々な事を試したのですが、うまくいきません。 何かいい方法をご存知の方ご教授お願い致します。 | ||||||||
|
投稿日時: 2003-03-18 10:06
Dim StrData As String
Dim Bytbuf(256) As Byte 自己レスです。 私が今まで、試した内容です。 StrData = Encoding.Unicode.GetString(Bytbuf) これも駄目でした。 MultiByteToWideCharを使用しても駄目でした。 CStr関数も駄目で、String関数はなくなってました。 上記以外で、これは?といった意見がありましたら 教えて頂けないでしょうか? 宜しくお願いいたします。 | ||||||||
|
投稿日時: 2003-03-18 11:01
0が入っている文字列というのは?
0が入っているのにそこで終わりではないというのは、どんな文字コードの文字列ですか? | ||||||||
|
投稿日時: 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等へ変換して利用する側の使い勝手を良くしたいというのが ベースにあるのです。 よろしくお願いします。 | ||||||||
|
投稿日時: 2003-03-18 13:00
それって、原理上不可能では? Byteデータが文字コードなのか数値なのかを見分ける方法はありません。値が49だとしても、それが数値の49なのか'1'という文字コードなのか、区別する手段はありません。 サーバとの取り決めで、たとえば「何バイト目から何バイト目は文字コード」としておくなどしないと。 あと、最終的に文字列として出力したいのなら、Byte値から文字コードへの変換は自分でやるしかありません。
とかでしょうか。 | ||||||||
|
投稿日時: 2003-03-18 14:47
>Byte列の扱いを文字だったらString、数値だったらInteger等へ変換して
ByteはByteデータです。へげもんさんの仰るように、shift-JISの文字コードか数値かはデータからは読み取れませんので、サーバークライアント間のプロトコルにより、そのバイトが文字コードか数値かどちらを表しているか判るものとして話を進めます。
まずここが分からないのですが、「数値だったらInteger等」なんですよね? ですが数値を文字列に変えようとするような例が上に出ているので、混乱してしまいます。 それに1バイトの値が一つの数値を表すのですか?例えば4バイトで一つの数値を表すことなどは? | ||||||||
|
投稿日時: 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) これも駄目でした。 --------------------------------------------------------------------- も試したとの事で、的外れかも知れません。 | ||||||||
|
投稿日時: 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 などとやってみてください。これは使えませんか? |