どのように単純なデータ型にファイルからバイトを抽出していますか?
-
25-09-2019 - |
質問
私は私が考えることができるすべてのものを試したし、仕事に何かを得ることはできません。私は私に次のようなデータ、バイナリデータとして、その後フロートの配列のサイズを伝えている(もちろん、バイナリで)、基本的には整数で構成され、私はVB.Netで書かれてきたバイナリファイルを持っています。ファイルには、VB.Netからちょうど罰金を書き込み、私は、Visual C ++を通じてうまく次のコードを使用して戻ってそれを読むことができます:
ifstream output("c:\\out.ipv", ios::in | ios::binary);
UInt32 len;
UInt32 *ptr2 = (UInt32*)&len;
output.read((char*)ptr2, 4);
456780のこの戻り正しい値は、バイトである:76、248、6、0私はiPadで正確に同じコードを実行すると、私は、以下の代替方法を使用する場合、私は1043089572.を取得
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
UInt32 num;
const NSRange numV = {0, 4};
[data getBytes:&num range:numV];
このコードは異なる値、124724を返し、私は正確なバイトをファイルから引き出さ取得されているものを読むためにかどうかはわかりません。他の人の何かことを私は把握しようとしましたが、作業することができませんでした。同じ方法では、Visual Cでの作品が++ iPad上で動作しないことを、なぜ任意のアイデア?私はこの1つ上の損失で本当によ。
解決 2
OK、本当に奇妙な何かが私のデータで起こっています。私はただのVisual C ++とObjective-Cの両方で生のバイト値を見て、彼らは全く同意しません。私は、ファイルの最初の4つのバイトを読み込み、その値で探しています。私は正しくでそれらを読んでいないよというこの時点で仮定しているが、私はここに欠けているのか分かりません。私はバイト値を見るために使用していますのVisual C ++のコードは以下の通りです:
ifstream input("c:\\out.ipv", ios::in | ios::binary);
Byte tmp[4];
input.read((char*)&tmp[0], 4);
TMP配列内の値である
76
248
6
0
私はObjective-Cで同じことを行う場合:
ifstream input([filePath UTF8String], ios::in | ios::binary);
Byte tmp[4];
input.read((char*)&tmp[0], 4);
I入手ます:
164
72
44
62
何ができますか?私は、少なくとも同じバイト値を取得すると予想しています。私はとのトラブルを抱えています4つのバイトを含むファイルはここにある: newout1 .ipvする
EDITます:
これらは、私はそれで何かを置く前にバイト配列を持っているintial値です:164,72,44,62バイト値がどこから来ている。私が実現しました。何らかの理由で行ます:
input.read((char*)&tmp[0], 4);
何もしていません。それはそれのように、ファイルからの読み込みいない理由を任意のアイデアべきか。
FINAL EDITます:
それは私が本当にばかに見えるので、はOK、私はおそらくこれに答えを投稿してはいけませんが、私はこれらの記事を読んで、誰もが混乱する必要はありません。常に同じ値にもそれらが割り当てられていたとき、彼らが持っていた値どんなことを何が起こったのか、どんなにを返すされた配列やオブジェクトはそう。それはout..ipvはなくout.ipvで読み取るようにしようとしていたので、私は、私のファイル名に1あまりにも多くの。のを持っていました。私は、ファイル名を修正すると、すべてのものは、私はそれが予想される正確にどのように働いていました。申し訳ありませんが、混乱のため、およびeveryonesの助けに感謝します。
他のヒント
エンディアンの問題のようなこの音。指定したエンディアンでデータを読み取るために<libkern/OSByteOrder.h>
のすべての機能を使用することができます。あなたのケースでは、あなたのような何かをしたいことがあります。
NSInputStream *istream = [NSInputStream inputStreamWithFileAtPath:filePath];
UInt32 num = 0;
if (istream) {
uint8_t buffer[4];
if ([istream read:buffer maxLength:4] == 4) {
num = OSReadLittleInt32(buffer, 0);
} else {
// there weren't 4 bytes in the file
}
} else {
// the file could not be opened
}