无法替换序列化textview中的数据,字节数组大小问题?

时间:2018-11-17 19:27:34

标签: python serialization replace encoding gtk

我真的很努力处理序列化的文本缓冲区数据。我刚遇到一个SQL编码问题(感谢theGtkNerd的帮助。)现在我的麻烦又回来了。 我正在尝试向使用pixbufs和格式化文本的textview添加搜索/替换功能,因为我将图像/标签存储在缓冲区中,因此我尝试对序列化textview缓冲区数据进行替换。   只要替换字符串的大小与searchstr相同,以下代码就可以工作。

def _diagFnRReplaceAll(self,oWidget): #Replace All Function
    findbox = self.builder.get_object('FnRFindEntry')
    searchstr = findbox.get_text()
    buf = self.dataview.get_buffer()
    repbox = self.builder.get_object('FnRReplaceEntry')
    repstr = repbox.get_text()
    format = buf.register_serialize_tagset()

    data = buf.serialize(buf, format, buf.get_start_iter(),
    buf.get_end_iter())

    sys.stdout.buffer.write(data) #< print raw for debugging
    newdata = data.replace(bytes(searchstr,'ascii'),bytes(repstr,'ascii'))
    print("\n\n\n\n")
    sys.stdout.buffer.write(newdata) #< print raw for debugging

    buf.set_text('')
    format = buf.register_deserialize_tagset()
    buf.deserialize(buf, format, buf.get_end_iter(),newdata)

如果其较小或较大,则会出现以下错误。

Gtk:ERROR:../../../../gtk/gtktextbufferserialize.c:1588:text_handler: code should not be reached

我尝试更改编码类型和不同的编码方式,但没有帮助。相同大小的字符串可以正常工作的事实使我认为序列化的缓冲区数据或pixbuf数据在某个地方有一个大小值,但是我无法通过搜索得出任何结果。 我试图像在没有图片的textview上那样进行替换,它起作用了,但是丢失了pic / format数据。

有人知道为什么会这样吗?

或者有人知道我可以在具有pixbuf数据和格式标签的textview小部件中进行搜索和替换的另一种方法吗?

1 个答案:

答案 0 :(得分:0)

好吧,我只是用一点字节补丁就知道了。我刚刚看到您对标记的评论,我会研究一下,因为我宁愿使用内置功能而不是即时通讯功能。我的方法是将GTKBUFFERCONTENTS-001之后的4个字节替换为新的4字节值,以使用新的缓冲区大小。 这是我现在正在工作的东西

def _diagFnRReplaceAll(self,oWidget):
    findbox = self.builder.get_object('FnRFindEntry')
    searchstr = findbox.get_text()
    buf = self.dataview.get_buffer()
    repbox = self.builder.get_object('FnRReplaceEntry')
    repstr = repbox.get_text()
    format = buf.register_serialize_tagset()
    data = buf.serialize(buf, format, buf.get_start_iter(), buf.get_end_iter())



    start_bytes = data[0:26]
    size_bytes =data[26:30]
    sizeval = int.from_bytes(size_bytes, byteorder='big', signed=False)

    end_of_markup = 29 + sizeval +1 
    the_rest = data[end_of_markup:len(data)]
    markup = data[30:end_of_markup]

    newmarkup = bytearray(markup.replace(bytes(searchstr,'ascii'),bytes(repstr,'ascii')))

    newsize = len(newmarkup).to_bytes(4,'big')

    reconstruct =start_bytes + newsize + newmarkup +the_rest


    buf.set_text('')
    format = buf.register_deserialize_tagset()
    buf.deserialize(buf, format, buf.get_end_iter(),reconstruct)

到目前为止,该方法没有问题,如果我将其与“商标”建议一起使用,我会重新发布。再次感谢theGtknerd。