Кто-нибудь знает, как посчитать количество байтов в строке?

Если у меня есть строка в JavaScript, как лучше всего подсчитать количество байтов или битов, которые занимает строка?

Моя первая мысль заключается в том, что, поскольку спецификация EcmaScript (5.1) указывает в 8.4, что строковые элементы в EcmaScript состоят из 16-битных значений и что языки используют кодировку символов UTF-16, я должен получить десятичное представление этого (charCodeAt), раздели это на два, получи результат, и Боб - брат твоего отца.

Но если мне нужно преобразовать каждый символ в двоичный (toString(2)), чтобы подсчитать биты, буду ли я считать 0 так же, как и 1? Или только 1?

Из того, что я прочитал в Интернете (и информации мало), я думаю, что это что-то вроде:

Math.floor("A".charCodeAt(0) / 2); // 32 bits... No?

person Tom    schedule 26.07.2011    source источник
comment
Это довольно запутанно. Строка длины N в алфавите M-байтовых символов занимает N x M байтов для представления... это так просто. Требуется в 8 раз больше битов.   -  person Patrick87    schedule 27.07.2011
comment
@shelman Да, но я считаю 0 и 1 в двоичном формате? Или только 1, так как 1 представляет состояние «включено», а 0 — состояние «выключено».   -  person Tom    schedule 27.07.2011
comment
UTF-16 не является кодировкой с фиксированной шириной (unicode.org/faq/utf_bom.html #utf16-1). Символ может занимать 16 или 32 бита, хотя обычно он помещается в 16 бит.   -  person Krab    schedule 27.07.2011
comment
Ты все считай. Компьютер должен хранить все биты, потому что есть много 8-значных двоичных строк с одинаковым количеством единиц, но они не все одинаковые.   -  person Patrick87    schedule 27.07.2011
comment
@Thomas То есть, если у меня есть 01000001, лучше ли считать это 1 байтом? Или 65 бит? Или это вообще 65 бит?   -  person Tom    schedule 27.07.2011
comment
Вам нужно подсчитать как 0, так и 1, если кто-то попросит вас просто подсчитать биты. Помните, что бит — это, по сути, мера содержания информации. ТАК, если у вас есть поле с информационным содержанием 16 бит, это означает, что существует 2 ^ 16 возможных конфигураций, из которых ваша текущая конфигурация является лишь одной. Ваша битовая строка является одной из этих конфигураций, но вам нужны нули, чтобы определить, есть ли другие конфигурации с 16 битами.   -  person Charlie Martin    schedule 27.07.2011
comment
@Charlie Итак, 01000001 - это просто 8 бит? Прохладный. Можете ли вы превратить это в ответ, чтобы я мог проголосовать за него? Кроме того, вы знаете какие-нибудь хорошие книги по этому поводу? Я самоучка (до университета в следующем году). :)   -  person Tom    schedule 27.07.2011
comment
@Krab - реализации JavaScript также могут использовать UCS-2, кодировку фиксированной длины.   -  person Wayne    schedule 27.07.2011
comment
@Krab Я собираюсь купить книгу по Unicode, просто чтобы освоить ее, но прямо сейчас мне нужно точное представление о том, сколько памяти занимает строка в localStorage ... Я просто предполагаю одно символ - один байт.   -  person Tom    schedule 27.07.2011
comment
@ Том, ты ошибаешься. Символы в JavaScript имеют размер не менее двух байтов, а могут быть и больше.   -  person Wayne    schedule 27.07.2011
comment
@Iwburk Я так и думал изначально! Потому что это UTF-16 (2-4 байта)! ... Окей круто. Два байта это. Спасибо!   -  person Tom    schedule 27.07.2011


Ответы (2)


@Charlie Итак, 01000001 - это просто 8 бит? Прохладный. Можете ли вы превратить это в ответ, чтобы я мог проголосовать за него?

Точно, смотрите ниже.

Вам нужно подсчитать как 0, так и 1, если кто-то попросит вас просто подсчитать биты. Помните, что бит — это, по сути, мера содержания информации. ТАК, если у вас есть поле с информационным содержанием 16 бит, это означает, что существует 2 ^ 16 возможных конфигураций, из которых ваша текущая конфигурация является лишь одной. Ваша битовая строка является одной из этих конфигураций, но вам нужны нули, чтобы определить, есть ли другие конфигурации с 16 битами. - Чарли Мартин вчера

Кроме того, вы знаете какие-нибудь хорошие книги по этому поводу? Я самоучка (до университета в следующем году). :) — Том вчера

Я не знаю, честно. Я кое-что погуглил, и я продолжаю получать вещи, которые учат включать компьютер, что-то, что вы явно уже освоили. Вы можете попробовать Думайте как компьютерщик.

person Charlie Martin    schedule 28.07.2011

Хм, если каждый элемент в строке имеет длину 16 бит, не будет ли количество битов, занимаемых строкой, равным string.length * 16?

person shelman    schedule 26.07.2011
comment
Я мог бы, но будет ли это верным представлением того, сколько памяти потребляет строка? Я использую это для управления пространством localStorage и хочу установить квоты на объем сохраняемых данных, поэтому мне нужно постоянно счет, понимаешь? - person Tom; 27.07.2011