Skip to content

Instantly share code, notes, and snippets.

@phpusr
Created March 13, 2014 14:36
Show Gist options
  • Save phpusr/9529689 to your computer and use it in GitHub Desktop.
Save phpusr/9529689 to your computer and use it in GitHub Desktop.
Класс для конвертирования символьных данных, которые получаются из Glyph-индексов в нормальные символы
package com.phpusr.glyph
/**
* @author phpusr
* Date: 12.03.14
* Time: 14:16
*/
/**
* Класс для конвертирования символьных данных, которые получаются из Glyph-индексов
* в нормальные символы
*/
class GlyphToCharDecoder {
/** Хэш-мап для конвертирования символов */
private static Map<Integer, String> decodingMap = createDecodingMap()
/** Добавлять ли символы записанные под Unicode-индексами */
private static final ADD_UNICODE = false
/** Включена-ли отладка */
private static final DEBUG_MODE = false
/**
* Конвертирует строку состояющую из индексов Glyph, в нормальную строку
* Для конвертирования используются индексы шрифта Courier New
*/
static String decodeString(String encodeMessage) {
StringBuilder decodeMessage = new StringBuilder()
for(int i=0; i<encodeMessage.length(); i++) {
char symbol = encodeMessage.charAt(i)
decodeMessage << decodeChar(symbol)
}
return decodeMessage.toString()
}
/**
* Конвертирует символ, который получается из Glyph индекса, в нормальный символ
* Для конвертирования используются индексы шрифта Courier New
*/
static String decodeChar(char symbol) {
int symbolIndex = symbol as int
String decodeSymbol = decodingMap.get(symbolIndex)
//Для отладки: выводит индексы не распознанных символов
if (DEBUG_MODE && !decodeSymbol) {
println "null: $symbolIndex"
}
return decodeSymbol
}
/**
* Создает хэш-мап соответствий индексов, символам
* Часть символом записывается под Glyph-индексами, а часть под Unicode
* (Так сделано потому, что в файле присутствоет и то, и другое)
* Для конвертирования используются индексы шрифта Courier New
*/
private static Map<Integer, String> createDecodingMap() {
Map map = [:]
int startIndex = 0
if (ADD_UNICODE) {
//Добавление символов, записываемых под Unicode-индексами
//В начале, чтобы индексы могли быть перезаписаны позже
putUnicodeSymbols(map)
}
//Добавление разных знаков
def otherSymbols = [3: ' ', 11: '(', 12: ')', 16: '-', 18: '/'] as Map<Integer, String>
map.putAll(otherSymbols)
//Добавление цифр
def numbers = 0..9
startIndex = 19
numbers.each { num->
map.put(startIndex++, num.toString())
}
//Добавление русских букв, сначало строчных, затем прописных
def russianSymbols = ['а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'ё']
startIndex = 570
russianSymbols.each { symbol ->
map.put(startIndex++, symbol.toUpperCase())
}
russianSymbols.each { symbol ->
map.put(startIndex++, symbol)
}
return map
}
/** Добавляет в хэш-мап символы, записывая их под Unicode-индексами */
private static void putUnicodeSymbols(Map<Integer, String> map) {
//Добавление разных знаков
def otherSymbols = [32: ' ', 40: '(', 41: ')', 45: '-'] as Map<Integer, String>
map.putAll(otherSymbols)
//Добавление английских букв, сначало строчных, затем прописных
def englishSymbols = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
int startIndex = 65
englishSymbols.each { symbol ->
map.put(startIndex++, symbol.toUpperCase())
}
startIndex = 87
englishSymbols.each { symbol ->
map.put(startIndex++, symbol)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment