Armin.Engineer Ответов: 1

Скачанный размер более чем реален


Привет любимый
Я написал программу с C# и Microsoft API, которая показывает объем загрузки, который у вас был, но она не говорит мне правильный размер загружаемого файла, например: если я загружаю файл размером 10 МБ, программа показывает, что загружено 11 Мб.
Я также проверил в окне состояния сети, что все еще говорит мне так же, как моя программа.
Почему? Работает ли другое программное обеспечение в ISP так же, как и у меня?
Спасибо

Что я уже пробовал:

Я не очень старался, я просто хочу знать, что вызывает эту проблему?

1 Ответов

Рейтинг:
2

Jochen Arndt

Откуда вы взяли размер и как он печатается (как значение преобразуется в МБ)?

Разница может быть получена путем использования различных определений для MB., MB относится к 2-основанным экспонентам, в то время как это было заменено на MiB и MB относится к 10-основанным экспонентам. Смотреть также Мебибайт - Википедия[^].


Armin.Engineer

Я меняю формулу и делюсь на это число 1048576
у меня был файл размером 183 мегабайта, но на этот раз я вычислил 190 мегабайт.

Jochen Arndt

Пожалуйста, покажите свой расчет или проверьте его сами. Если у вас есть размер в байтах:
MB = размер / (1000 * 1000)
MiB = размер / (1024 * 1024)
Для правильного округления при использовании целочисленной арифметики добавьте половину значения деления:
MB = (размер + 1000 * 500) / (1000 * 1000)
MiB = (размер + 1024 * 512) / (1024 * 1024)

Armin.Engineer

Спасибо.
Это размер установочного файла :
Размер : 183 МБ (192,340,232 байта)
Размер на диске: 183 МБ (192,344,064 байта)

Мое приложение вычисляет около 190 МБ, когда эта передача fie происходит в моей локальной сети.
Почему?

Jochen Arndt

Размер диска обычно немного больше, потому что данные хранятся там кусками (секторами). Ваш диск имеет размер сектора 4 Кб (4096 байт). Таким образом, файл занимает 46 959 секторов (192,344,064 / 4096) на диске.

Я не знаю, почему ваша программа показывает 190 МБ, потому что вы до сих пор не показали нам, как вы получаете и вычисляете свою ценность.

Armin.Engineer

objIPInterfaceStatistics2 = objNetworkInterface[numberinterface].GetIPStatistics();
долго newBytesreceived;
newBytesreceived = objIPInterfaceStatistics2.BytesReceived;
if (checkdata = = true)
{
checkdata = false;
newBytesreceived = 0;
}
long newUsage = newBytesreceived - oldBytesreceived2;
Traffic usage += newUsage;
float converttrafficusage = Traffic / 1048576;
oldBytesreceived2 = objIPInterfaceStatistics2.BytesReceived;
работник.ReportProgress ((int)Math.Потолок (converttrafficusage));
Нить.Спать(1000);


Это правда?

Jochen Arndt

Видишь https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipinterfacestatistics(v=vs. 110).aspx:
"BytesReceived получает количество байтов, которые были получены на интерфейсе."

Это необработанные байты, полученные на интерфейсе. К ним относятся байтесс заголовка пакета и протокола.

[РЕДАКТИРОВАТЬ]
И он может включать в себя байты из других коммуникаций!
[/РЕДАКТИРОВАТЬ]

Но вам, вероятно, нужна только полезная нагрузка. Это число байтов, наконец, сохраненное. Как это сделать, зависит от того, как хранятся данные (например, с потоками, получая длину потока после того, как все байты были получены).

Armin.Engineer

Да, вы правы.
Я должен изменить свой алгоритм