Как правильно преобразовать размер файла в байтах в мегабайты или гигабайты?

Я использую класс DriveInfo в своем проекте C# для получения доступных байтов на заданных дисках. Как мне правильно преобразовать это число в мегабайты или гигабайты? Думаю, деление на 1024 не поможет. Результаты всегда отличаются от показанных в проводнике Windows.


person Mats    schedule 19.02.2009    source источник


Ответы (6)


1024 подходит для использования в программах.

Причина, по которой у вас могут быть различия, вероятно, связана с различиями в том, что driveinfo сообщает как «доступное пространство», и какие окна считают доступным пространством.

Обратите внимание, что только производители дисков используют 1000. В окнах и большинстве программ правильное масштабирование — 1024.

Кроме того, хотя ваш компилятор все равно должен оптимизировать это, этот расчет можно выполнить, просто сдвигая биты на 10 для каждой величины:

KB = B >> 10
MB = KB >> 10 = B >> 20
GB = MB >> 10 = KB >> 20 = B >> 30

Хотя для удобочитаемости я ожидаю, что последовательное деление на 1024 будет более четким.

person Adam Davis    schedule 19.02.2009
comment
Да, только производители дисков используют определения на основе 1000. Вот почему ваши диски емкостью 4,7 ГБ на самом деле составляют 4 700 372 992 байта, 50 ГБ Blu-Ray — всего 50 050 629 632 байта, ваш mp3 со скоростью 128 кбит/с — это фактически 128 000 бит в секунду, 3,1-мегапиксельная камера имеет всего 3 145 728 пикселей, а процессор с частотой 2 ГГц — 2 000 000 герц. шина памяти 16 ГБ/с на самом деле 16 000 000 байт в секунду, ... - person endolith; 13.08.2009
comment
Поскольку мы говорим о дисках, утверждение остается в силе. Я мог бы быть более точным и сказать, что производители оборудования представляют размер в миллиардах, а разработчики программного обеспечения представляют размер в гибибайтах, но это достаточно ясно. Вы правы, утверждая, что многие другие вещи имеют аналогичные проблемы, но это обсуждение касается размеров файлов и дисков, а не скорости процессора, размеров сенсора изображения и т. д. Извините, если я вас запутал, надеюсь, это прояснит ситуацию. - person Adam Davis; 13.08.2009
comment
1024 правильно только потому, что оно представляет фактическое количество битов на диске. Однако, если вы беспокоитесь о правильности, вам нужно отобразить это с единицей измерения GiB. Использовать 1024 и называть его ГБ технически неверно. ГБ официально 1000 миллионов, а не 1024 миллиона. Я бы сказал, что 1000 — это правильное использование с точки зрения человеческого фактора. 1 гигаватт это 1000 мегаватт. 1 ГГц это 1000 МГц. Точно так же (и для упрощения математических вычислений людьми) 1000 гигабайт — это 1000 мегабайт. - person Bryan Oakley; 01.09.2009
comment
Нет, @Adam, @Bryan прав. Не имеет смысла, что стандартные префиксы SI будут означать разные вещи, когда вы говорите о дисках или байтах, это степени 10, а не степени 2. например. При использовании степени двойки правильным термином будет мегабайт, а не мегабайт. - person John Leidegren; 21.10.2010
comment
@Bryan, @john - Пользователи будут жаловаться, если ваша программа выдаст номер, отличный от номера ОС и КАЖДОЙ другой программы. Если вам нужен разумный пользовательский опыт, вам следует серьезно подумать о том, чтобы придерживаться общепринятого соглашения. Тем не менее, это ваша программа, с которой вы можете поступать по своему усмотрению, и если вы готовы ответить на вопросы клиентов о том, что такое GiB или почему ваше программное обеспечение сообщает о размерах дисков, отличных от всего остального, которое они видят, сделайте это. Имейте в виду, что префиксы SI отлично подходят для технической документации, но не обязательно предназначены для простого понимания конечным пользователем. - person Adam Davis; 21.10.2010
comment
Программное обеспечение Apple сообщает о размере файла и дисковом пространстве как 1 ГБ = 1 миллиарду байт, и я думаю, что видел, как несколько других программ делают то же самое. Вся эта штука с kilo-=1024 возникла в то время, когда экономия нескольких битов в адресуемом пространстве была большой проблемой, а экономия пары битов на переменную при делении на 1024 была намного дешевле в вычислительном отношении, чем деление на 1000, но на современном оборудовании это вряд ли можно сделать. разница. Однако на самом деле мало что можно получить, заботясь о разнице. Делайте то, что делает вас счастливым, потому что некоторые люди скажут вам, что вы не правы, несмотря ни на что. - person user2310967; 04.03.2014

У XKCD есть четкий ответ:

Единый окончательный стандарт для КБ

person starblue    schedule 19.02.2009
comment
@Adam Davis Для RAM ECC это именно то, что делается на практике. - person starblue; 14.03.2009
comment
хотя это смешно, это не отвечает на вопрос и может сбить с толку тех, кого легко сбить с толку. - person Bryan Oakley; 01.09.2009
comment
Некоторые машины имеют нестандартную архитектуру с большим или меньшим числом битов на байт, чем 8. Я имею в виду мэйнфреймы UNIVAC 1103/1103A/1105/1100/2200 с 9-битным числом на байт (и возможностью запуска программ, которые только использовать 6 бит на байт). Таким образом, KBa на этих машинах больше не будет соответствовать Baker's Kilobyte, а станет стандартным. - person Zarepheth; 15.03.2016

1024 на самом деле неправильно. Международное инженерное сообщество (IEC) разработало в 2000 году стандарт, который, к сожалению, игнорируется компьютерной индустрией. Этот стандарт в основном говорит, что

  • 1000 байт — это килобайт, 1000 КБ — это один МБ и так далее. Сокращения: КБ, МБ, ГБ и так далее.
  • Широко используемые 1024 байта = 1 килобайт вместо этого должны называться 1024 байта = 1 кибибайт (КиБ), 1024 КиБ = 1 Мебибайт (МиБ), 1024 МиБ = 1 Гибибайт (ГиБ) и так далее.

Вы все можете прочитать его в зоне IEC SI.

Таким образом, чтобы ваши преобразования были правильными и правильными в соответствии с международной стандартизацией, вы должны использовать эту научную нотацию.

person Community    schedule 19.02.2009
comment
Стандартно или нет, было бы нелепо сообщать об использовании диска иначе, чем хост-ОС! - person Adam Lassek; 19.02.2009
comment
Проблема в том, что эти хост-ОС делают это неправильно, и любой конечный пользователь задается вопросом, почему новый диск, который он купил в магазине, сообщает об установке меньше раз, чем то, что напечатано на его коробке. - person ; 19.02.2009
comment
re: было бы нелепо сообщать об использовании диска другим способом, чем основная ОС: Snow Leopard (Mac OSX 10.6) использует значение 1000 (support.apple.com/kb/TS2419) - person Bryan Oakley; 01.09.2009
comment
-1 для утверждения 1024 на самом деле неверно. IEC может сказать 1000, но GNU говорит 1024 (попробуйте сделать df -h в Linux). Похоже, что IEC — это просто пешка производителей жестких дисков. - person User1; 03.12.2010
comment
Используйте стандартное игнорирование других! КБ десятичное КБ двоичное - person Patricio Rossi; 12.02.2016

Это зависит от того, хотите ли вы фактический размер файла или размер на диске. Фактический размер файла — это фактическое количество байтов, которые файл использует в памяти. Размер на диске зависит от размера файла и размера блока для вашего диска/файловой системы.

person EBGreen    schedule 19.02.2009

Я смутно припоминаю, что ответ на вопрос, использовать ли 1000 или 1024, лежит в корпусе префикса. Пример: если используется «научная» шкала 1000, то «научная» единица измерения будет кБ (так же, как в кг, кН и т. д.). Если используется компьютерно-ориентированное масштабирование 1024, единицей измерения будет КБ. Итак, заглавная буква научного префикса делает его компьютерно-ориентированным.

person Anders    schedule 08.01.2010
comment
КБ = 1000 байт, КиБ = 1024 байта - person Brad Gilbert; 08.02.2012
comment
+1 Для k против K это правильно, но это не помогает, когда буква для префикса ISO уже в верхнем регистре, как в M, G и T для Mega, Giga и Tera. И многие люди, особенно из США, имеют тенденцию смешивать регистр единиц ISO и префиксов. - person starblue; 11.10.2012

Разделите на 1024.

person Fabian Vilers    schedule 19.02.2009