Следующая проблема смутило меня много:Являются ли переменные (длинными, двойными ...) в файлах, хранящихся неправильно?
Я экспериментировал о том, как doubles
и особенно их «специальные» ценности, как PositiveInfinity
сохраняются в файле, который не было никаких проблем. Я сделал это в три простых шага: Создание double
; записывая его в файл; чтение файла в файл byte
. Это было довольно легко, и теперь я знаю, как Double.NaN
выглядит в двоичном формате :)
Но потом я наткнулся на следующее:
Согласно .Net Framework-есть NegativeZero
:
internal static double NegativeZero = BitConverter.Int64BitsToDouble(unchecked((long)0x8000000000000000));
как это представляется довольно простой (по стандарту IEEE 754):
long
представляет собой двоичный номер: 10000000 ...
Первый бит говорит, что double
отрицательный. Итак, что представляет собой NegativeZero
, является - 0 * 2^0
, так как мантисса и показатель степени равны 0
.
Представление «нормального» 0 будет тогда равным 64 битам, установленным на 0
.
Но проблема читает эти цифры в byte
массив. То, что я должен это следующий за NegativeZero
: 128
0
0
... [двоичная: 100000 ...]
Но на самом деле это было не так наоборот: 0
0
... 128
! [binary: 00000 ... 0 10000000]
Моя первая мысль была: «Возможно, File.ReadAllBytes()
возвращает все в неправильном порядке (что было бы неудобно)». Поэтому я решил проверить читателя с string
(-> создать файл со строкой, прочитал его в byte
массив)
Результат был просто отлично: «Привет» все еще «Hello» в byte
массиве, а не в качестве примера из предложенного выше «olleH».
Опять Everthing в двух словах:
Запись двоичного числа (10000000 00000000 00000000) в файл работает отлично.
Чтение же двоичного числа в byte
массив оказывается:
[0]00000000 [1]00000000 [2]10000000
Чтение файла не может быть проблемой, так как strings
остаются теми же.
НО: Интерпретация массива byte
обратно к исходной переменной (длинной, двойной ...) возвращает правильный результат.
Таким образом, по моему мнению, переменная bytes
хранится в неправильном порядке.
Это правда? И если да, то почему это делается так, потому что, по моему мнению, это похоже на нарушение IEEE 754 (но, очевидно, работает)?
И, пожалуйста, поправьте меня, если я что-нибудь здесь отсутствует, как я до сих пор слишком смущен после нескольких часов поисков ответа на эту проблему ...
Чтение http://en.wikipedia.org/wiki/Endianness может помочь вам. –
@ Jon Skeet Спасибо! Но это помогло просто решить части проблемы. Остается вопрос: почему «строки» хранятся в правильном порядке? Можно ли испортить две системы в одном файле? Или это связано с кодированием строк? – Jibbow
Endianness влияет только на определенные единицы измерения, такие как 'long' или' double'. Если вы хотите увидеть эффект endianness на строках, попробуйте использовать Encoding.Unicode vs 'Encoding.BigEndianUnicode'. –