![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Есть пример:
Как узнать размер текстовой переменной В БАЙТАХ, а не в символах? SizeOf(StringVar) показывает 4 байта постоянно. |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Length(StringVar)*SizeOf(StringVar[1]) + 4*3 + 4
Добавлено @ 15:45 Но, если StringVar содержит MultiByte строку, то эта формула не прокатит. Это сообщение отредактировал(а) Петрович - 25.3.2005, 15:44 -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
что есть MultiByte строка
|
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Слышь, Петрович, а если переменную сохранить в файл (обычный текстовый), размер файла будет тот же, что и по этой формуле, которую ты дал?
Это сообщение отредактировал(а) dsergey - 25.3.2005, 16:05 |
|||
|
||||
| ~FoX~ |
|
|||
![]() НЕ рыжий!!! ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2819 Регистрация: 8.10.2003 Где: Зеленоград Репутация: 13 Всего: 68 |
dsergey
Нет, размер файла будет в размер кластера. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
В размер кластера на диске, а на самом деле?
|
|||
|
||||
| ~FoX~ |
|
|||
![]() НЕ рыжий!!! ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2819 Регистрация: 8.10.2003 Где: Зеленоград Репутация: 13 Всего: 68 |
Точно, это он места на диске будет занимать кратное размеру кластера, а истенный размер будет то, что тебе надо.
|
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Я понимаю что, мы, программисты, любим понавыдумывать, но чтоб такое. Пучуму именно так? |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Почитай мою статью. Если после этого останутся еще вопросы, задавай. -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Marriage |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 4.5.2004 Где: Таганрог Репутация: нет Всего: 2 |
Length(StringVar)*SizeOf(char)
Может быть я слепой, но почему + 4*3 + 4 я так и не понял. ничего умне в голову пока не пришло ... Это сообщение отредактировал(а) Marriage - 26.3.2005, 20:42 -------------------- Praemonitus, praemunitus |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Блин, ошибочка вышла. Если точнее, то размер равен Length(StringVar)*SizeOf(StringVar[1]) + 1 + 4*2 + 4 Для тех кому не понятно поясню: + 1 - это дополнительный признак конца строки - символ с кодом 0 (#0) + 4*2 - это два слова находящиеся перед самой строкой Счётчик ссылок и Длина строки + 4 - это собственно переменная хранящая указатель на строку. Но, возможно, что данный размер еще округляется до кратного машинному слову, или кванту распределения памяти. Точно не могу сказать, не помню. -------------------- Все знать невозможно, но хочется |
|||
|
||||
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Петрович, смотри, что получается
размер текстового файла кодировки OEM (DOS) - 3921, копируем через буфер в memo1, считаем по "твоему методу":
а если сохранить содержимое memo1 в файл(memo1.lines.savetofile('c:\11.txt')), то вообще показывает 3997. Это сообщение отредактировал(а) dsergey - 31.3.2005, 14:26 |
||||
|
|||||
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: 5 Всего: 11 |
а разве 1 символ не равен 1 байту, тем более если речь идет о ПЕРЕМЕННОЙ?
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Так какой размер ты хочешь получить?
Размер занимаемой памяти переменной String или размер файла в байтах? Если размер файла, то просто берешь количество символов, добавляешь к ним количество строк*2 - это и будет размер файла.
Естественно. Мемо переносит строки, которые не влазят по ширине. И, когда ты сохраняешь, строк становится больше. А, как я писал выше, к размеру добавляется кол-во строк*2. Вот из-за этого и возникла погрешность - строк стало больше, размер вырос. |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
По подсчетам - 91581 байт (формула Петровича)
Размере файла - 91144 байт (это не размер на диске, прошу не путать) Получается разница в 437 байт Почему так? |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |