purebasic.info

PureBasic forum
Текущее время: Пт янв 19, 2018 2:28 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 04, 2013 6:41 pm 
Не в сети
студент

Зарегистрирован: Вс окт 28, 2012 9:38 pm
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Дык это же питон. Заходишь в папку с питоновскими либами(под виндой это папка питона\lib, и там можно найти тот самый picle в исходных кодах и рыться в них. ИМХО 47 кб самого picle и еще 80 кб его "утилит" работка не на один вечер


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн окт 21, 2013 9:39 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Ср фев 02, 2011 10:44 am
Сообщений: 382
Откуда: :адуктО
Благодарил (а): 6 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
давно начал рыться, потом перехотелось - но надо.... :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Pickle для Purebasic
СообщениеДобавлено: Пн окт 21, 2013 10:19 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Ср фев 02, 2011 10:44 am
Сообщений: 382
Откуда: :адуктО
Благодарил (а): 6 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Никогда не работал с подобными данными, поэтому хочу спросить совета знающих.
Есть исходный текст
Вложение:
Исходный текст.txt [24.52 KiB]
Скачиваний: 108
в питоновском Pickle вида:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(dp1
S'personal'
p2
(dp3
S'spotted'
p4
I0
sS'repair'
p5
I9095
sS'xpPenalty'
p6
I0
sS'markOfMastery'
p7
I0
sS'killerID'
p8
I37607167
sS'damageReceived'
p9
I1450
sS'premiumCreditsFactor10'
p10
I15
sS'shotsReceived'
p11
I9
sS'premiumXPFactor10'
p12
I15
sS'xp'
p13
I124
sS'droppedCapturePoints'
p14
I0
sS'damageAssisted'
p15
I101
sS'creditsContributionIn'
p16
I0
sS'eventFreeXP'
p17
I0
sS'damaged'
(без спойлера - обрезан, дабы не загружать портянку, полный во вложении)
 


после преобразования (десериализация в Питоне)текст становится таким:
Вложение:
Результат.txt [33.22 KiB]
Скачиваний: 120

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
        'arenaUniqueID': 16264690313833547L,
        'common': {
                'arenaCreateTime': 1351199819,
                'arenaTypeID': 131093,
                'bonusType': 1,
                'duration': 327.0,
                'finishReason': 1,
                'vehLockMode': 0,
                'winnerTeam': 2
        },
        'personal': {
                'accountDBID': 1890647,
                'achievements': [],
                'aogasFactor10': 10,
                'autoEquipCost': (0,
                0),
                'autoLoadCost': (1020,
                0),
                'autoRepairCost': 9095,
                'capturePoints': 0,
                'credits': 9616,
                'creditsContributionIn': 0,
                'creditsContributionOut': 0,
                'creditsPenalty': 0,
                'dailyXPFactor10': 10,
                'damageAssisted': 101,
                'damageDealt': 0,
                'damageReceived': 1450,
                'damaged': 0,
                'details': {
(обрезан, полный во вложении)
 


т.е. преобразовывается в Json.
Из за проблем с Питоном, народ уже сделал свои костыли - преобразователи на
С++ (к сожалению 4 аттач не влез поэтому на пастебине) и на Делфи
Вложение:
Комментарий к файлу: Код на Делфи
Delf_DPickle.txt [12.6 KiB]
Скачиваний: 107

Так вот хочу просить помощи в создании такого костыля на Пурике. Свиду вроде ничего сложного, как я понял из кода на паскале - побуквенное чтение, и в зависимости от символа - определяются массивы....
Если более конкретно, то как реализовать на пурике этот кусок кода из
Вложение:
Комментарий к файлу: Код на Делфи
Delf_DPickle.txt [12.6 KiB]
Скачиваний: 107
?:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
 //writeln(T, Buffer);
  Stek:=TList.Create;
  ParentStek:=TList.Create;
  QList:=TList.create;
  AddStek('Start', copy(Buffer, 1, pos(#128+#2, Buffer)-1), #128);
  Buffer:=copy(Buffer, pos(#128+#2, Buffer), Length(Buffer));
  l:=pos(#46, Buffer);
  while buffer[1]<>#46 do //'.'   # every pickle ends with STOP
    case buffer[1] of
    #40:begin  //'('   # push special markobject on stack
          //AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
          ParentStek.Add(Stek.Last);
        end;
    #48:begin //'0'   # discard topmost stack item
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #49:begin //'1'   # discard stack top through topmost markobject
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #50:begin //'2'   # duplicate top stack item
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    {#70:begin //'F'   # push float object; decimal string argument
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #73:begin //'I'   # push integer or bool; decimal string argument
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;}
    #74:begin // 'J'   # push four-byte signed int
          if ord(Buffer[5])<128 then
            V:=ord(Buffer[2])+ord(Buffer[3])*256+ord(Buffer[4])*256*256+ord(Buffer[5])*256*256*256
          else
            V:=ord(Buffer[2])+ord(Buffer[3])*256+ord(Buffer[4])*256*256+ord(Buffer[5])*256*256*256-4294967296;
          AddStek('', V, 'J');
          Buffer:=Copy(Buffer, 6, Length(Buffer)-5);
        end;
    #75:begin // 'K'   # push 1-byte unsigned int
          AddStek('', ord(Buffer[2]), 'J');
          Buffer:=Copy(Buffer, 3, Length(Buffer)-2);
        end;
{    #76:begin // 'L'   # push long; decimal string argument
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;}
    #77:begin // 'M'   # push 2-byte unsigned int
          AddStek('', ord(Buffer[2])+ord(Buffer[3])*256, 'M');
          Buffer:=Copy(Buffer, 4, Length(Buffer)-3);
        end;
    #78:begin // 'N'   # push None
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
{    #80:begin // 'P'   # push persistent object; id is taken from string arg
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #81:begin // 'Q'   #  "       "         "  ;  "  "   "     "  stack
         AddStek('', '', Buffer[1]);
         Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
       end;
   #82:begin // 'R'   # apply callable to argtuple, both on stack
         AddStek('', '', Buffer[1]);
         Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
       end;
   #83:begin // 'S'   # push string; NL-terminated string argument
         AddStek('', '', Buffer[1]);
         Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
       end;}
   #84:begin // 'T'   # push string; counted binary string argument
         V:=ord(Buffer[2])+ord(Buffer[3])*256+ord(Buffer[4])*256*256+ord(Buffer[5])*256*256*256;
         AddStek('', Copy(Buffer, 6, V), 'T');
         Buffer:=Copy(Buffer, 6+V, Length(Buffer)-5-V);
       end;
   #85:begin // 'U'   #  "     "   ;    "      "       "      " < 256 bytes
         V:=ord(Buffer[2]);
         AddStek('', Copy(Buffer, 3, V), 'U');
         Buffer:=Copy(Buffer, 3+V, Length(Buffer)-2-V);
       end;
{    #86:begin // 'V'   # push Unicode string; raw-unicode-escaped'd argument
         AddStek('', '', Buffer[1]);
         Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
       end;
   #88:begin // 'X'   #   "     "       "  ; counted UTF-8 string argument
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;}
    #97:begin // 'a'   # append stack top to list below it
          //AddStek('', '', Buffer[1]);
          RElement(Stek.Items[Stek.Count-1]^).Parent:=Stek.Items[Stek.Count-2];
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #98:begin // 'b'   # call __setstate__ or __dict__.update()
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #99:begin // 'c'   # push self.find_class(modname, name); 2 string args
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #100:begin // 'd'   # build a dict from stack items
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #125:begin // '}'   # push empty dict
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #101:begin // 'e'   # extend list on stack by topmost stack slice
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
          ParentStek.Delete(ParentStek.Count-1);
        end;
    #103:begin // 'g'   # push item from memo on stack; index is string arg
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #104:begin // 'h'   #   "    "    "    "   "   "  ;   "    " 1-byte arg
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #105:begin // 'i'   # build & push class instance
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #106:begin // 'j'   # push item from memo on stack; index is 4-byte arg
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #108:begin // 'l'   # build list from topmost stack items
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #93:begin // ']'   # push empty list
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
          EmptyList:=true;
        end;
    #111:begin // 'o'   # build & push class instance
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #112:begin // 'p'   # store stack top in memo; index is string arg
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #113:begin // 'q'   #   "     "    "   "   " ;   "    " 1-byte arg
         QList.Add(Stek.Last);
         //AddStek('', ord(Buffer[2]), Buffer[1]);
         //RElement(Stek.Items[Stek.Count-1]^).Val:=ord(Buffer[2]);
         Buffer:=Copy(Buffer, 3, Length(Buffer)-2);
       end;
   #114:begin // 'r'   #   "     "    "   "   " ;   "    " 4-byte arg
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 6, Length(Buffer)-5);
        end;
    #115:begin // 's'   # add key+value pair to dict
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #116:begin // 't'   # build tuple from topmost stack items
          ///AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
          ParentStek.Delete(ParentStek.Count-1);
        end;
    #41:begin // ')'   # push empty tuple
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #117:begin // 'u'   # modify dict by adding topmost key+value pairs
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
          ParentStek.Delete(ParentStek.Count-1);
        end;
    #71:begin // 'G'   # push float; arg is 8-byte float encoding
          V:=ord(Buffer[2])+ord(Buffer[3])*256+ord(Buffer[4])*256*256+ord(Buffer[5])*256*256*256+ord(Buffer[6])*256*256*256*256+ord(Buffer[7])*256*256*256*256*256+ord(Buffer[8])*256*256*256*256*256*256+ord(Buffer[9])*256*256*256*256*256*256*256;
          AddStek('', V, Buffer[1]);
          Buffer:=Copy(Buffer, 10, Length(Buffer)-1);
        end;
    #128:begin // '\x80'  # identify pickle protocol
          Buffer:=Copy(Buffer, 3, Length(Buffer)-2);
        end;
    #129:begin // '\x81'  # build object by applying cls.__new__ to argtuple
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #130:begin // '\x82'  # push object from extension registry; 1-byte index
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #131:begin // '\x83'  # ditto, but 2-byte index
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #132:begin // '\x84'  # ditto, but 4-byte index
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #133:begin // '\x85'  # build 1-tuple from stack top
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #134:begin // '\x86'  # build 2-tuple from two topmost stack items
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
          RElement(Stek.Items[Stek.Count-2]^).Parent:=Stek.Last;
          RElement(Stek.Items[Stek.Count-3]^).Parent:=Stek.Last;
        end;
    #135:begin // '\x87'  # build 3-tuple from three topmost stack items
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #136:begin // '\x88'  # push True
          AddStek('', true, Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #137:begin // '\x89'  # push False
          AddStek('', false, Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
    #138:begin // '\x8a'  # push long from < 256 bytes
          V:=0;
          V1:=1;
          for i:=1 to ord(Buffer[2]) do
            begin
              V:=V+ord(Buffer[2+i])*V1;
              V1:=V1*256;
            end;
          AddStek('', V, Buffer[1]);
          Buffer:=Copy(Buffer, 3+ord(Buffer[2]), Length(Buffer)-1);
        end;
    #139:begin // '\x8b'  # push really big long
          AddStek('', '', Buffer[1]);
          Buffer:=Copy(Buffer, 2, Length(Buffer)-1);
        end;
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB