1

考えられることはすべて試しましたが、何も機能しません。私はVB.Netで書いたバイナリファイルを持っています。これは基本的に整数で構成されており(もちろんバイナリで)、次のデータの配列サイズを示し、次にバイナリデータとして浮動小数点数を示します。このファイルはVB.Netから問題なく書き込まれ、次のコードを使用してVisualC++から問題なく読み戻すことができます。

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で機能しない理由はありますか?私はこれで本当に途方に暮れています。

4

2 に答える 2

1

OK、私のデータで本当に奇妙なことが起こっています。Visual c ++とobjective-cの両方で生のバイト値を調べたところ、まったく一致していません。私はファイルの最初の4バイトを読んで、それらの値を見ているだけです。この時点で私はそれらを正しく読んでいないと思いますが、ここで何が欠けているのかわかりません。バイト値を確認するために使用しているVisualC++コードは次のとおりです。

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);

私は得る:

164
72
44
62

何が得られますか?私は少なくとも同じバイト値を取得することを期待していました。私が問題を抱えている4バイトを含むファイルはここにあります:newout1.ipv

編集:

164,72,44,62バイトの値がどこから来ているのかを理解しました。これらは、バイト配列に何かを入れる前の初期値です。何らかの理由で次の行があります。

input.read((char*)&tmp[0], 4);

何もしていません。なぜファイルから読み取れないのか、何か考えはありますか?

最終編集:

OK、私は本当に馬鹿げているように見えるので、おそらくこれに対する答えを投稿するべきではありませんが、これらの投稿を読んでいる人が混乱することを望んでいません。そのため、配列とオブジェクトは、何があっても常に同じ値を返していました。これは、割り当てられたときに持っていた値でもありました。ファイル名に.が多すぎるため、out.ipvではなくout..ipvを読み込もうとしていました。ファイル名を修正すると、すべてが期待どおりに機能しました。混乱してすみません、そしてみんなの助けに感謝します。

于 2010-12-10T17:39:06.960 に答える
1

これはエンディアンの問題のようです。の任意の関数を使用<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
}
于 2010-12-10T00:01:49.960 に答える