Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Циклический сдвиг (https://javascript.ru/forum/misc/46035-ciklicheskijj-sdvig.html)

dmitriy37 25.03.2014 19:16

Циклический сдвиг
 
Ребятки помогите!!! у меня есть сообщение " мама мыла раму " мне его надо закодировать, надо каждые 4байта сдвинуть циклически влево на 2 бита, как это делается ума не приложу, а на чем то другом писать не умею

rekzi 25.03.2014 22:02

Получаете код каждого символа, он будет в шестнадцатеричном формате; переводите его в числовое преставление, применяете сдвиг, затем опять в шестнадцатеричное представление с формированием строки.

Sweet 25.03.2014 22:25

dmitriy37, что значит "каждые 4байта сдвинуть циклически влево на 2 бита"?
Цитата:

Сообщение от rekzi
Получаете код каждого символа, он будет в шестнадцатеричном формате

Как получить код в шестнадцатеричном формате?:)

rekzi 25.03.2014 23:44

charCodeAt(i) - возвращает десятичный код символа. Я думал будет шестнадцатеричное значение, по примеру с вставкой символов в строку.
С числовым значением можно работать как угодно.

dmitriy37 26.03.2014 18:56

если применить оператор сдвига << надо что бы биты циклично сдвинулись, а не что бы их места нули занимали, если можно небольшой пример

dmitriy37 26.03.2014 18:57

Цитата:

Сообщение от rekzi (Сообщение 304336)
charCodeAt(i) - возвращает десятичный код символа. Я думал будет шестнадцатеричное значение, по примеру с вставкой символов в строку.
С числовым значением можно работать как угодно.

если применить оператор сдвига << надо что бы биты циклично сдвинулись, а не что бы их места нули занимали, если можно небольшой пример

Дзен-трансгуманист 26.03.2014 20:25

function encode ( source ) {

  for ( var result = '', int32, i = 0; i < source.length; ) {

    int32 = source.charCodeAt(i++) << 16 | source.charCodeAt(i++);
    int32 = int32 << 2 | int32 >>> 30;
    result += String.fromCharCode( int32 >>> 16, int32 & 65535 );
  }

  return result;
}

function decode ( result ) {

  for ( var source = '', int32, i = 0; i < result.length; ) {

    int32 = result.charCodeAt(i++) << 16 | result.charCodeAt(i++);
    int32 = int32 >>> 2 | int32 << 30;
    source += String.fromCharCode( int32 >>> 16, int32 & 65535 );
  }

  return source.charCodeAt(i-1) == 0 ? source.slice(0, -1) : source;
}

console.log( encode( 'мама мыла раму' ));
console.log( decode( encode( 'мама мыла раму' )));

dmitriy37,
Всё довольно просто, не так ли? ))

dmitriy37 26.03.2014 21:26

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 304567)
function encode ( source ) {

  for ( var result = '', int32, i = 0; i < source.length; ) {

    int32 = source.charCodeAt(i++) << 16 | source.charCodeAt(i++);
    int32 = int32 << 2 | int32 >>> 30;
    result += String.fromCharCode( int32 >>> 16, int32 & 65535 );
  }

  return result;
}

function decode ( result ) {

  for ( var source = '', int32, i = 0; i < result.length; ) {

    int32 = result.charCodeAt(i++) << 16 | result.charCodeAt(i++);
    int32 = int32 >>> 2 | int32 << 30;
    source += String.fromCharCode( int32 >>> 16, int32 & 65535 );
  }

  return source.charCodeAt(i-1) == 0 ? source.slice(0, -1) : source;
}

console.log( encode( 'мама мыла раму' ));
console.log( decode( encode( 'мама мыла раму' )));

dmitriy37,
))

т.е здесь сдвигаются каждые 4 байта? а на сколько бит они сдвигаются??

Дзен-трансгуманист 26.03.2014 22:28

Цитата:

Сообщение от dmitriy37
т.е здесь сдвигаются каждые 4 байта? а на сколько бит они сдвигаются??

Про битовые операторы можно почитать здесь, а потом понять ответ на свой вопрос самостоятельно. ;)
Попутно, если не в курсе, в JS используется юникод, и на каждый символ отводится 16 бит (в т.ч. части суррогатных пар).

dmitriy37 26.03.2014 22:49

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 304583)
Про битовые операторы можно почитать здесь, а потом понять ответ на свой вопрос самостоятельно. ;)
Попутно, если не в курсе, в JS используется юникод, и на каждый символ отводится 16 бит (в т.ч. части суррогатных пар).

т.е здесь за раз кодируется два символа??


Часовой пояс GMT +3, время: 09:32.