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

このQ&Aのポイント
  • Windows2000-SP4/VB6-SP5環境で、ユニコードのデータをVBで直接入出力し、VB内でstring型で扱いたい場合、byte型で受け取り、APIの「MoveMemory」(または「RtlMoveMemory」)でstring型に変換する方法を教えてください。
  • VBの入出力では自動的にsjis/unicode変換がされるので、binaryで受け取り、string型にすることを考えていますが、経験不足でうまくいきません。VBでbyte型とstring型の双方向のbinary変換の方法を教えてください。
  • Windows2000-SP4/VB6-SP5環境でユニコードのデータをVBで直接入出力する際、byte型とstring型の双方向のbinary変換方法を教えてください。
回答を見る
  • ベストアンサー

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

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

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

dim s as string dim b() as byte '文字列 -> byte配列 b = s 'byte配列 -> 文字列 s = b

zabutin1000
質問者

お礼

ありがとうございました

zabutin1000
質問者

補足

todo36さん さっそくの回答どうもありがとうございます。 "="で型変換できるとは驚きです。 下記のテストをしてみました。 Private Sub Command1_Click() Dim byt1() As Byte Dim str1 As String Open "c:\data\in.csv" For Binary Access Read As #1 Open "c:\data\ou.csv" For Binary Access Write As #2 ReDim byt1(1) Get #1, , byt1 ReDim byt1(21) Get #1, , byt1 str1 = byt1 MsgBox ("< " & str1 & " >") ReDim byt1(1) byt1(0) = &HFF byt1(1) = &HFE Put #2, , byt1 ReDim byt1(21) byt1 = str1 Put #2, , byt1 Close #1 Close #2 End Sub sjis対応以外の文字もそのまま出力されることは確認しました BOMの2バイトを含め24バイトのファイルを入出力しました ただ、何が稚拙なのか、24バイトのあとに142バイトのゴミがついて出力されました。どこに問題があるのでしょうか。何か判りますでしょうか。 

関連するQ&A

  • javaでのshift_jis対応以外のunicodeの入出力

    windows2000sp4 j2sdk1.4.2_05の環境です .netでは、直接unicodeでの入出力が行われるとか聞いているのですが、javaのFileInputReader/Writerで、encodingに、UTF-16 UTF-16LE UTF-8 等を指定して、入出力を行った時、どうも、s-jis対応外の文字は、"?"に変換されてしまうようで、FileInput/OutputStream を用い、バイナリで処理してみようとおもったのですが、byte型とString型(または、BufferString型)とのbinaryなデータのcopyがよく分かりません。何かご存知の方 お教え頂けないでしょうか

    • ベストアンサー
    • Java
  • [VB.net] StringからByte配列への変換

    皆さんこんばんは。 最近VB.NET2000でVisual Basicをはじめたのですが、どうにもString型の値をByte配列へ変換するやり方が分かりません。 VB6.0だとByte配列にStringを代入するだけでいいそうなのですが、.NETで代入しようとすると『型"String"の値を"Byteの1次元配列"に変換できません』というビルドエラーが表れてしまいます。 CByte( Mid(str,i,1) ) CLng( Mid(str,i,1) ) 他にも上記コードのように一つずつ変換しようと試みたのですが、String中のある文字がワイドバイトらしく、System.InvalidCastExceptionが表れてしまいます。 ("『"を上下反転したような文字) ワイドバイトのStringを1バイトずつ区切ってByte配列やLong配列へ格納する手法というものはありませんでしょうか。 よろしくお願いします。

  • 固定長String?

    固定長String(String * 8など)をメンバに持つユーザ定義のストラクチャーにサーバより受信したデータをメモリコピーを行います。 この固定長StringにSJISデータを設定した時に、末尾に†が詰められていることがあります。ASCIIデータでは普通にデータが入っています。SJISデータでおかしいので単純に漢字データでおかしくなったのかな?と思ったのですが、SJIS(漢字含みデータ)でも†が詰められる時と詰められない時があります。どういった時に†が詰められるのかご存知の方教えて下さい。 そもそも、VBのString型のコード体系ってどうなっているんですか?デフォルト設定時、内部UNICODEのwindows環境下でSJISでいいんでしたっけ? 一度に2つもすいません。

  • [VBScript][wsh]byte単位でのデータの切り出し

    以前LenBに関して質問した者です。 今回は 「ある文字列の○byte目から△byte分取得する」という処理で困っています。 MidB関数を使うと思うのですが、Unicodeの為、 BASP21の.KconvでSJISに変換してあげています。 HOGEasc = objBasp.Kconv(MidB(tmpLine, ○, △),1) ここで問題となるのが、切り出した文字列が化けてしまうのです。 以下のようにもう一度Unicodeに変換してあげてもダメです。 HOGEuni = objBasp.Kconv(HOGEasc,4) いろいろ試してみましたが、お手上げ状態です。 このような処理はできないのでしょうか? どうぞよろしくお願いいたします。

  • APIについて

    文字列をsjisからjisに変換して、 byte型に格納しているのですが dim data() as byte data()をapi関数に渡しているのですが、 apiに渡すときに、apiでの定義は bdata as byte となっていて、バッファを送信するとあります。 この場合、渡す方法としては、data()の配列数分のloopを 行い、1つずつ渡していく方法になるのでしょうか? よくわからない質問かも知れませんが、ご存知の方がいらっしゃいましたらよろしくお願いします。

  • テキストBOXから取得した文字コードの扱いについて

    JSPで記述したページのテキストBOXに入力されたSJIS形式の日本語文字データをサーブレットに送信してそれを取得して、文字のエンコードを行う際に気がついたのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("ISO8859_1"); text=new String(bytes, "SJIS"); のようにすればサーブレットで扱う時に正しく日本語表示できるのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("SJIS"); text=new String(bytes, "SJIS"); とすると正しく表示されません。 text.getBytes("SJIS");で取得格納されるbyteのデータに違いがあるようです。この場合取得されるbyteの配列は3つになっています。 ISO8859_1で取得するとbyte配列は2つになっています。このISO8859_1のbyte配列のデータと同じ中身のものを単にString(byteデータ,文字コード)のコンストラクタに入れるとSJISの文字コードで正しく変換出来ています。 要するにもともとSJISの文字データをgetByte("SJIS")で変換したものがなんで、もとに戻せないのかということです。また、違う文字コードのISO8859_1ではSJISに対応したbyteの配列になるのかということです。 ひどい乱文ですみませんが、よろしくお願いします。

  • unicode <-> sjis 変換

    UNICODEからSJISに変換するDLLをVC6.0で作成しました。 2層のswitch文で30000行(約400キロバイト)のソースファイルになりました。 コンパイル後も500キロバイトほどになります。 しかしvectorなどにおいてある変換ソフトをみると100キロバイトほど でした。そういったソフトはどのようにして変換しているのでしょうか? (APIかなにかを呼び出しているのでしょうか?) あるいはunicodeとsjisの漢字コードに数学的な相関関係があるのでしょうか?

  • 画像のbyte[]データの読み込みついて

    Javaのbyte[]の読み込みについて質問です。 外国産の外部APIのメッソドで次のようにあります。 public void transferImage(byte[] fileByteArray, java.lang.String ImageName,) Parameters: fileByteArray - byte array consisting of image data ImageName - name of the image 例)「test.jpg」という画像データを用意しまた。 ImageName="test.jpg"; と指定出来ました。 fileByteArray=null; としか値を入れれません。 質問) テキストファイルの出力なら一行単位で読み込めますが、画像の時はどのようにデータを取得すればいいのですか? nullの代わりに何を代入したらよいのか教えて下さい。

    • ベストアンサー
    • Java
  • SJIS->UTF8->SJISコード変換について

    Windows XPでVB.NET2010で文字コード変換のプログラムを下記のように作成しました。 Dim beforeStr As String = "変換前" Dim utfEnc = System.Text.Encoding.GetEncoding(65001) Dim sjisEnc = System.Text.Encoding.GetEncoding(932) Dim beforeBytes() As Byte = utfEnc.GetBytes(beforeStr) Dim afterBytes() As Byte = System.Text.Encoding.Convert(sjisEnc, utfEnc, beforeBytes) Dim afterStr As String = sjisEnc.GetString(afterBytes) TextBox3.Text = afterStr Dim reverseStr As String = afterStr Dim reverseBytes() As Byte = sjisEnc.GetBytes(reverseStr) Dim baseBytes() As Byte = System.Text.Encoding.Convert(utfEnc, sjisEnc, reverseBytes) TextBox4.Text = utfEnc.GetString(baseBytes) SJIS->UTF8に変換して、確認のためにUTF8->SJISに逆変換してみましたが、 「変換」までは正しいのですが、最後の「前」が文字化けしてしまします。 正しくSJIS-.UTF8->SJISするには、どのように修正すればよろしいでしょうか? よろしくお願いします。

  • VBのByte配列をVARIANTに格納してCOMでVCに渡したい

    OS: WinXP sp2 開発: VB6 sp5 <--> VC6 sp5 MFC OCX いままでVB/VC間のデータのやりとりをStringで行っていたアプリがありまして、現在はVB側から見たインターフェースをByte()へ変更する作業を行っています。 まず VB --> VC に関して質問ですが Dim byteStream(5) As Byte byteStream(0) = 1 byteStream(1) = 2 byteStream(2) = 3 byteStream(3) = 4 byteStream(4) = 5 などとし、メソッドに対してbyteStreamをVariantで渡してやって C側から const VARIANT FAR& で参照してきて、 この.pcVal(配列の先頭アドレスが入っているはず)をchar*で受け取ろうと思いました。 するとこのアドレスには、先頭のbyteStream(0)の値しか入ってきません。 VB側でVariant = Byte()とするときに値渡しになっているっぽい?のですが、仕組みがわかりません。 この理由が知りたいです。 ODLファイルを変更して対処すべきかもしれませんが、MFCのウィザードが「慎重に行ってください。」とコメントしているので質問させていただきました。 VB側でのメソッドの宣言: Function SendVariantStream(stream, length As Integer) As Boolean odlファイルでの宣言: boolean SendVariantStream(VARIANT stream, short length) VCの宣言: BOOL SendVariantStream(const VARIANT FAR& stream, short length);