2013-11-17 4 views
1

Я пытаюсь создать алгоритм на основе линейной алгебры для шифрования криптографии с сдвигом (Ceasar). Предположим, у меня есть строка: «привет». Когда я пытаюсь преобразовать его в (целое) число матрицы Я делаю это:Matlab: String vector - вычитание символов

'hello' - 'a' 

И результат

ans = 

7  4 11 11 14 

Это желаемый результат. Но если я вычесть символ «г» результат будет

ans = 

1 -2  5  5  8 

Я хотел бы спросить, что происходит в Matlab (или Октав), когда я вычитать характер, и я получаю результаты выше.

+0

Если у вас установлен [разный пакет] (http://octave.sourceforge.net/miscellaneous/index.html), он имеет fu nction 'asci', который отображает красиво отформатированную таблицу, показывающую, как каждый символ интерпретируется в десятичной и шестнадцатеричной. – carandraug

ответ

4

Как писал Мохит Jain, результаты вы получаете основаны на преобразовании в ASCII, который является наиболее распространенным методом для численного кодировать текстовую информацию. ASCII также включен как поднабор в текущем стандарте Unicode, а на поддерживающих платформах Matlab фактически использует 16-битную кодировку Unicode, которая позволяет ему не только отображать 95 печатных символов ASCII, которые поддерживают английский текст, но и большое количество международных сценариев, специальных символов для приложений в математике, типографии и many other fields. Явное преобразование между числовыми и символьными данными в Matlab осуществляется через char и double:

>> double('aAΔ') 
ans = 
    97 65 916 

Небольшой латинской буквы «а» имеет код ASCII 97, большой латинской буквы «А» код ASCII 65, а большая греческая буква Delta имеет номер Unicode 916. Так как латинские буквы кодируются последовательно с кодами от 97 до 122 для небольших букв и от 65 до 90 для столиц, вы можете создать английский алфавит, например как это:

>> char(65 : 90) 
ans = 
ABCDEFGHIJKLMNOPQRSTUVWXYZ 

При применении арифметического оператора как - на символьные строки, символы неявно преобразуются в число, как если бы вы использовали double

>> double('hello') 
ans = 
    104 101 108 108 111 
>> double('g') 
ans = 
    103 

и поэтому 'hello' - 'a' такие же, как

>> [104 101 108 108 111] - 103 
ans = 
    1 -2  5  5  8 
+0

Это было очень полезно и решило мой вопрос, большое спасибо! – IrishDog

+0

Добро пожаловать! :-) –

1

Это изменяет символы строки в их ASCII значение, а затем вычитает значение каждого

'hello' - 'a' = 7 4 11 11 14 because h - a = 8 -1 =7 
(these should be ascii values but i am using these values for simplicity because its all relative) 
e-a=5-1=4 
l-a = 12-1 =11 and so on 
'hello' - 'g' 
h-g=8-7=1 
e-g=5-7=-2 and so on 
Смежные вопросы