используя ctypes.memset() в python2.7

Я пытаюсь memset подстроку в файле python, используя ctypes.memset

Вот код, который я использую:

import ctypes

def memz(string):
    buffsize = len(string)+1
    size = sys.getsizeof(string)
    offset = size - buffsize
    start = string.find('{') -----------> 142
    end = string.find('}') + 1  --------> 167
    location = id(string)
    ctypes.memset(location + offset + start, 0, end-start)

Я вижу, что это не memset подстроки, а записывает какую-то другую часть памяти. Я подозреваю, что не передаю правильную ячейку памяти в ctypes.memset. Нужно ли мне изменить формат местоположения (местоположение + смещение + начало), которое я передаю в ctypes.memset?

PS: решение получено из отметить данные как конфиденциальные в python. Я попробовал это решение, но использование memset из ctypes.CDLL('libc.so.6').memset приводит к ошибке seg. Я использую Python2.7.11.


person truth_seeker    schedule 23.03.2018    source источник


Ответы (1)


Ваше решение тоже работает. Я попытался запустить его локально, и он очистил требуемую подстроку.

str = 'This is a {sample} string'

print(ctypes.string_at(id(str), sys.getsizeof(str)))

buffSize = len(str)+1
size = sys.getsizeof(str)
offset = size - buffSize
start = str.find('{')
end = str.find('}') + 1
location = id(str)

ctypes.memset(location + offset + start, 0, end-start)

print(ctypes.string_at(id(str), sys.getsizeof(str)))

Он производит следующий вывод

 ���A,�5~��dThis is a {sample} string
 ���A,�5~��dThis is a  string
person bhushan    schedule 24.03.2018
comment
Спасибо, что попробовали это. Я попробовал это и на своей локальной машине, и это сработало, но это не работает как часть большого кода, где я его использую. - person truth_seeker; 24.03.2018
comment
Возможно, вы можете попробовать другой способ расчета смещения от начального местоположения. вы можете использовать startIndex = ctypes.string_at(id(string), sys.getsizeof(string)).find('{') endIndex = ctypes.string_at(id(string), sys.getsizeof(string)).find('}'), а затем использовать memset memset( id(string) + startIndex, 0, endIndex-startIndex+1) - person bhushan; 24.03.2018