| author | Christian Urban <urbanc@in.tum.de> | 
| Fri, 17 Mar 2017 12:15:58 +0000 | |
| changeset 479 | 4fcaa5a2d199 | 
| parent 145 | 920f675b4ed1 | 
| child 481 | e2e13cc2c9d7 | 
| permissions | -rw-r--r-- | 
| 479 | 1  | 
// convert normal string to hex bytes string  | 
2  | 
def string2hex(str: String): String = {
 | 
|
3  | 
str.toList.map(_.toInt.toHexString).mkString  | 
|
4  | 
}  | 
|
5  | 
||
6  | 
// convert hex bytes string to normal string  | 
|
7  | 
||
8  | 
||
9  | 
val byteArray: Array[Byte] = List.range(1, 255).map(_.toByte).toArray  | 
|
10  | 
val bos = new BufferedOutputStream(new FileOutputStream("test.txt"))
 | 
|
11  | 
bos.write(byteArray)  | 
|
12  | 
bos.close()  | 
|
13  | 
||
14  | 
||
15  | 
def string2int(hex: String) = {
 | 
|
16  | 
hex.sliding(2, 2).map(Integer.parseInt(_, 16)).toArray  | 
|
17  | 
}  | 
|
18  | 
||
19  | 
def test(l: List[Int]) = {
 | 
|
20  | 
l.map(_.toChar).mkString  | 
|
21  | 
}  | 
|
22  | 
||
23  | 
||
24  | 
import java.io._  | 
|
25  | 
val writer = new PrintWriter(new File("test.txt" ))
 | 
|
26  | 
||
27  | 
//writer.write(string2int("cafebabe"))
 | 
|
28  | 
writer.write(test(List.range(1, 255)))  | 
|
29  | 
writer.close()  | 
|
30  | 
||
31  | 
import scalax.io._  | 
|
32  | 
import scalax.io.Resource  | 
|
33  | 
||
34  | 
FileOutputStream fos = new FileOutputStream("test");
 | 
|
35  | 
fos.write(bytesArray);  | 
|
36  | 
fos.close();  | 
|
37  | 
||
38  | 
||
39  | 
string2int("cafebabe")
 | 
|
40  | 
||
41  | 
202.toHexString  | 
|
42  | 
||
43  | 
"cafebabe".sliding(1, 1).toList.map(Integer.parseInt(_, 16)).map(_.toByte).map(_.toChar)  | 
|
44  | 
||
45  | 
hex2string("ca")
 | 
|
46  | 
string2hex("ca")
 | 
|
47  | 
hex2string("cafebabe")
 | 
|
48  | 
||
49  | 
||
50  | 
val appkey = "9GLV//lv/kYFW2o3/bihxwnMcmo="  | 
|
51  | 
||
52  | 
// string to hex  | 
|
53  | 
val appkey_hex = string2hex(appkey)  | 
|
54  | 
// 39474c562f2f6c762f6b594657326f332f62696878776e4d636d6f3d  | 
|
55  | 
println(appkey_hex)  | 
|
56  | 
||
57  | 
// hex to string  | 
|
58  | 
val appkey_string_again = hex2string(appkey_hex)  | 
|
59  | 
// 9GLV//lv/kYFW2o3/bihxwnMcmo=  | 
|
60  | 
println(appkey_string_again)  | 
|
61  | 
}  | 
|
62  | 
||
63  | 
||
64  | 
List("ca", "fe", "ba", "be").map(_.toByte)
 | 
|
65  | 
||
66  | 
"ca".toByte  | 
|
67  | 
||
68  | 
||
| 
145
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
69  | 
// DFAs  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
70  | 
import scala.util._  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
71  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
72  | 
abstract class State  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
73  | 
type States = Set[State]  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
74  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
75  | 
case class IntState(i: Int) extends State  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
76  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
77  | 
object NewState {
 | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
78  | 
var counter = 0  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
79  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
80  | 
  def apply() : IntState = {
 | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
81  | 
counter += 1;  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
82  | 
new IntState(counter - 1)  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
83  | 
}  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
84  | 
}  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
85  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
86  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
87  | 
// DFA class  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
88  | 
case class DFA(states: States,  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
89  | 
start: State,  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
90  | 
delta: (State, Char) => State,  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
91  | 
               fins: States) {
 | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
92  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
93  | 
  def deltas(q: State, s: List[Char]) : State = s match {
 | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
94  | 
case Nil => q  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
95  | 
case c::cs => deltas(delta(q, c), cs)  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
96  | 
}  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
97  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
98  | 
// wether a string is accepted by the automaton or not  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
99  | 
def accepts(s: String) : Boolean =  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
100  | 
Try(fins contains  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
101  | 
(deltas(start, s.toList))) getOrElse false  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
102  | 
}  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
103  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
104  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
105  | 
// example DFA from the lectures  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
106  | 
val Q0 = NewState()  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
107  | 
val Q1 = NewState()  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
108  | 
val Q2 = NewState()  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
109  | 
val Q3 = NewState()  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
110  | 
val Q4 = NewState()  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
111  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
112  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
113  | 
val delta : (State, Char) => State = {
 | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
114  | 
case (Q0, 'a') => Q1  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
115  | 
case (Q0, 'b') => Q2  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
116  | 
case (Q1, 'a') => Q4  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
117  | 
case (Q1, 'b') => Q2  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
118  | 
case (Q2, 'a') => Q3  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
119  | 
case (Q2, 'b') => Q2  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
120  | 
case (Q3, 'a') => Q4  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
121  | 
case (Q3, 'b') => Q0  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
122  | 
case (Q4, 'a') => Q4  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
123  | 
case (Q4, 'b') => Q4  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
124  | 
}  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
125  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
126  | 
val DFA1 = DFA(Set(Q0, Q1, Q2, Q3, Q4), Q0, delta, Set(Q4))  | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
127  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
128  | 
println(DFA1.accepts("aaa"))
 | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
129  | 
println(DFA1.accepts("bb"))
 | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
130  | 
println(DFA1.accepts("aaac"))
 | 
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
131  | 
|
| 
 
920f675b4ed1
added
 
Christian Urban <christian dot urban at kcl dot ac dot uk> 
parents:  
diff
changeset
 | 
132  |