• ベストアンサー

DOSで、ASCIIデータをバイナリコピーにて結合するとゴミがはいる?

DOSで、2つのASCIIデータをバイナリコピー(COPY /b)すると1バイトのゴミが入る場合があるのですが、なぜこのようになるのでしょうか? しかし、必ずゴミが入るわけではないようにも思います。 →たまたま入る時がある? →ASCIIデータの形によって、入る時がある? バイナリコピーしない場合(COPY)は混在することは無いように思います。 昔、ASCIIデータは、バイナリコピーしない方が無難と聞いたことがある気もするのですが、昔過ぎて理由等忘れてしまいました。 詳しい方いらっしゃいましたらお教えいただけると助かります。

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

  • ベストアンサー
  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

手元の環境でやってみました(WindowsのDOS窓ですが) その1バイト増えるごみ というのはもしかしたらファイルの最後に 付いておりデータとして 0x1A(16進) ではありませんか? (此方でやった限り逆にアスキーコピーした時に付いてるようですが) そうならファイルの終了マーカを意味している物ではないかと思います http://support.microsoft.com/kb/29852/ja ファイルの中間にデータが増えるとか言うのでしたら 具体的なファイルのダンプコードなどをチェックするか ここに乗せた方がいいのではないかと思います アスキー(テキスト)ファイルの作成方法によってはファイル終了マーカとして 最後に0x1Aが書き込まれます 例) DOSプロンプト上で copy con ファイル名 等として直接ファイル入力 終了する時には CTRL+Z の入力となりそのような作成すると 0x1Aが書き込まれます プログラムなどでファイル造作する場合でもアスキーモードで開けば このデータは無視されるはずです

nnahito
質問者

お礼

返答が遅くなり申し訳ありません。 内容理解し試したところその通りでした。 とても助かりました。

その他の回答 (1)

noname#194317
noname#194317
回答No.2

No1回答者さんからも指摘がありますが、テキストファイルの末尾にあるEOFコードがその正体でしょう。ただこれも、どのテキストファイルにも存在するかというと、必ずしもそうとは言い切れません。Windows付属のメモ帳(NOTEPAD.EXE)で作成したテキストファイルも、確かWin98の頃にはもうEOFコードは付かなくなっていたと思います。もはやEOF自体が、かなり歴史的理由のためだけに存在するものになっているため、なくても問題ないでしょう。今となっては、EOFがあることで問題を起こすことの方が多いかも知れません。 また、これはDOSの頃からの伝統ですが、COPYの/Bオプションの機能は、複数ファイルを結合する時、ファイル内にEOFコードがあってもそこで停止しないようにするだけです。なので、もし結合するバイナリファイルの中にEOFと同じデータがない場合は、/Bをつけてもつけなくても動作は同じです。これとは逆に、末尾がEOFでないテキストファイルを結合する時も、やはり/Bの有無には関係なく同じファイルが出来上がります。 テキストとバイナリでファイルを区別することは、フロッピーですら贅沢品であった時代の遺物と言ってよいのでは?今はもう個人でも普通にGB単位の大きさのファイルを扱う時代です。マシンパワーもファイル管理ごときでは負荷らしい負荷になりません。テキストかバイナリかでコマンドの動作を変えることの合理性は、すでにほぼ失われたと個人的には思います。 余談ながら、ftp転送でも同様にテキストとバイナリを区別できますが、これもやはり歴史的理由と言えるでしょう。良かれと思ってテキストモードで転送したのに、サーバ側で勝手に改行コードや文字コードを変えられてしまい、えらい目に遭ったなんて言うトラブルもありますし、こちらも害の方が目立つ状況です。全てバイナリモードでアップロードすれば、こうした問題は起きないので、普通のユーザーにとってはむしろ確実です。

nnahito
質問者

お礼

返答が遅くなり申し訳ありません。 補足説明ありがとうございました。 とても助かりました。

関連するQ&A

  • C++でバイナリデータのコピープログラムの作り方

    現在、バイナリのデータを高速でコピーするルーチンを 考えています。 既存データ(Data A) を 新規データ(Data B)、新規データ(Data C)にコピーするときに、3byteずつコピーしたいのですが。 Data BとData Cへは3Byteを交互にコピーします。 (以下のようになります) aaa bbb ccc ddd eee (←コピー元 Data A) B C B C B (←コピー先 Data B,C) 一番早くコピーする方法をお教え願えませんでしょうか?

  • MIMEとバイナリデータの読み方

    バイナリファイルの中、MIME boundary1の後、ヘッダーの部分のXMLで書かれたテキストファイルあります。そのXMLヘッダー文をパースしたい。 バイナリファイルのほかのところにMIME boundary2の後バイナリ形式のデータあります。 Googleで調べたけど、なにかは見つかったけど、理解できず困っています。 バイナリファイルを一バイトづつ読んで、Integer.toHexString()を使うとASCIIの形でXMLの部分はそのまま (フォーマットなしで)、バイナリデータの分は化けた表示されます。 だいたいのアウトラインでよいです。やり方ご存知の方、教えてください。 (1)boundary1の後書かれたXML式データを読む方法 (2)boundary2の後、決まったキーワードが入っていたら、そこから決まったバイト数までのバイナリデータを読む方法 その決まったキーワードと決まったバイト数はヘッダーのXML内に書かれています。

    • ベストアンサー
    • Java
  • バイナリデータについて

    バイナリデータについて 先日関連した質問をさせていただいただのですが、 質問内容があやふやでしたのであらためて 今回POS連携システムにてPOSへ渡すデータを固定長バイナリ型式で作成いたします。 JAVAにてデータ作成を行うのですが、その作成方法がよくわかりません。 例えば次の6項目があるとして 元のデータ[0001] → 属性[K] 長さ[2Byte] 元のデータ[20100901] → 属性[K] 長さ[4Byte] 元のデータ[1234567890123456ffff] → 属性[K] 長さ[10Byte] 元のデータ[000100] → 属性[P] 長さ[3Byte] 元のデータ[0000001c] → 属性[P] 長さ[4Byte] 元のデータ[01] → 属性[B] 長さ[1Byte] 元のデータから各属性への変換、ファイル出力がイメージがわきません。 属性のK,P,Bというのもよくわかりません。 どなたかヒントでもいただけたら幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • バイナリデータの取り方

    VB6を使用して、バイナリファイルをバイナリデータとして文字列にとりたいのですが、全角文字が絡んだ時の処理がうまくいきません。 バイナリファイルをString型の変数に丸ごと読み込んで、後は何バイトから何バイト目を抜き取り数値に変換…という処理をしようとしています。 本来は、バイナリでファイルをオープンして、Getコマンドで取得するのが手っ取り早いのですが、ファイルアクセス回数を減らすため、このような面倒な方法をとっております。 そこで仮に、 dim test as string dim i as integer test = "aあ" & chr(1) & "0 " For i = 1 to 6 Debug.Print Asc(Strconv( _ MidB(Strconv(test,vbFromUnicode),i,1), _ vbUnicode)) Next のようなソースを作ってみました。(本来は文字列は数100KByte…) しかしながら、この方法ですと上の例では2Byte目、つまり「あ」の文字の1Byte目が「&H00」になってしまいます。その次は「&HA0」、他の箇所も問題ないのですが… おそらくは根本的に違う方法で解決すべきではないかと思うのですがその方法がわかりません。 なお、この格納データはバイナリデータなので、意図的に全角文字にしていくてもその値によって(偶然)全角文字になったり制御文字になったりしますので前もって全角文字に対する処理は難しいと考えてます。 質問の仕方が良くなく、質問の内容がなかなかご理解いただけないとは思いますが、ご存知の方、ご経験者の方、ご教授お願いいたします。

  • バイナリデータからの値の取得について教えてください

    今、バイナリデータから値を取りだそうとがんばっています。 しかし、うまくいかずに困っています。 困っていることは2点あります。 (1)バイナリデータにはリトルエンディアンで格納していると書いています。 まず、リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか? (2)バイナリデータには、 はじめに文字列(char)型4バイトで「RIFF]という値 次に32ビット符号なし整数で4バイトの数字、 次に4052バイトの構造体 などと収納されているようです。 このように入っているデータから値を取得するにはどのようにしたらよいのでしょうか? 全然できなくて困っています。 教えていただけないでしょうか? よろしくお願いいたします。

  • ファイル(データ)のコピー

    C言語初心者です。 昨年末、C言語の講習時に友人に「例えば100Kくらいのテキストファイルを とあるメモリにコピーする場合、ファイル単位でコピーするのと バイナリ単位でコピーするのはどっちが早いでしょう~?」みたいな ことを言われました。 考えてもよく分からなかったので、実際にコーディングをして実行時間を 計ってみようと思ったのですが、ファイル単位とバイナリ単位でデータを コピーするには具体的にどのようにしたらよいのでしょうか? fopenでテキストファイルをオープンして内容を読み込み、 読み込んだデータをfopenで新規ファイルへ書き込む。 この方法だと、バイナリ単位ということになるのでしょうか?

  • DOSモードでデータの吸い上げ

    windowsXPや98などでwindowsが起動しなくなった時にDOSモードでデータを取り出す時についてお尋ねします。 前にWin98でwindowsが起動しなくなった時に、起動フロッピーを入れてDOSモードで、取り出したいデータを「copy *.doc a:」という感じでフロッピーに取り出したのですが、もしフロッピーに入らない大きなデータの時はどうやって取り出せばいいのですか?OSが起動してないので、USBの外付けHDDはつけても認識しませんよね?みなさんはどうやって取り出しますか?教えてください。

  • バイナリデータの書込みについて

    こんにちは、初めまして。 さっそくなんですが、バイナリデータの操作を行っていて、ちょっと気になることがあり、質問させて頂きます。 現在あるバイナリデータファイルの読出しには成功し、一応思った通りに書込み、 そのデータは壊れず、読み出せたんですが・・・。 そのバイナリデータファイルは当然のように、アスキー型や文字型、ビッグエンディアンのshortやlongがバイト長ごとに入り混じってます。 アスキー型や文字型は問題なく読み書きできるんですが、 ビッグエンディアンのshortやlongを書き込む時、バイト長を指定してやると、データが壊れてしまいます。 例えば、2バイトのビッグエンディアンのshortを読み出して、そのままリスト値に変換をかけ、なにも加工することなく、再びバイナリ構造体に変換しても、データが壊れてしまいます。 例 失敗) INは読み出すファイル、OUTは書き込むファイル read (IN,$dataB,2); $dataA = unpack("n2",$dataB); $dataB2 = pack("n2",$dataA); print OUT $dataB2; 現在、packするときに、データ長をしてせず、*とすることでデータの書込みには成功してる(ちゃんと読めるデータとして)んですが、これから先、こういったデータを加工して書き込む場合、データ長を指定せずに書き込むというのは・・・。ちょっと嫌な感じです。 例 成功) INは読み出すファイル、OUTは書き込むファイル read (IN,$dataB,2); $dataA = unpack("n2",$dataB); $dataB2 = pack("n*",$dataA); print OUT $dataB2; 何が原因なのか、わからず困っています。 なにぶん素人なもので、やってること自体間違っているのかもしれませんが、どなたか御回答頂ければ幸いです。 ここに書いている質問の意図がわからない等、ありましたらその旨お答え頂ければ、私の知る限りお答えしようと思いますので、どうか宜しくお願い致します。

    • ベストアンサー
    • Perl
  • VBAでバイナリデータが上手く読めない。

    VBAでバイナリデータが上手く読めない。 もともとC言語でバイナリデータを加工していた事をVBAでやる事になったのですが、上手く読めない。 <VBA> Open inputFileName For Binary As #mFileNo のようにオープンして、 <VBA> Dim a(800) As Byte Get #1, , a のように記述すればC言語のように取得出来ると思ったのですが、上手く取得出来ません。 なんとなく分かった事ですが、800バイトの中に改行文字があった場合、そこまでを変数aに入れるようにすると出来そうなので、Getで改行コードがあった場合はそこまでを読み込むみたいな手段はありますでしょうか。inputだとデータがまったく見れませんでしたのでGetにて対応したいと思っています。 宜しくお願い致します。

  • Win2000 DOS窓 C言語で COM1入力バイナリを読み込み表示したい

    どうしたら良いでしょうか。 ThinkPad, Windows2000, DOS窓, Borland C v5.5.1 無料版 COM1の読込みのみ(書き出し無し) dataは、バイナリ形式で、約120Byte/秒(時に121Byte/秒だったり若干変動します)で入ってくる垂れ流し方式。一連のデータの先頭であることは、header (0x10 0x03 0x10 0x75という4バイト)の存在で識別します。 このようにCOM1から入力されてくる情報の一部をシンプルにDOS窓で表示するプログラムを作成したいのです。どんな感じのプログラムを打てばいいのか分かりません。もしわかる人がいましたら教えてください、できればプログラム付で教えてもらえればうれしいです。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=106550 に関連質問と回答がありましたが、UNIXの例でしたので私には使えないので、windows2000のDOS窓、borland C v5.5.1で、動く例を教えて頂けますると、うれしいです。 よろしくお願い致します。