Я пытаюсь назвать это
// cryptography.go
func getDecryptedMessage(message string, d int, prime1 int, prime2 int) *C.char {
///
//do something
/////
return C.CString("hello from go")
}
//app.py
lib = cdll.LoadLibrary("./cryptography.so")
class go_string(Structure):
_fields_ = [
("p", c_char_p),
("n", c_longlong)]
lib.getDecryptedMessage.restype = c_char_p
b = go_string(c_char_p(decryptedMsg), len(decryptedMsg))
print (lib.getDecryptedMessage(b, c.d,c.prime1, c.prime2))
Он напечатает: b'hello from go'. Результат должен быть: привет от go
я строю его с
go build -buildmode=c-shared -o cryptography.so cryptography.go
Кто-нибудь может мне помочь? Редактировать: я думаю, что это должно быть что-то не так с
lib.getDecryptedMessage.restype = c_char_p
Вот уменьшенная версия:
//app.py
from flask import Flask, jsonify
from flask import abort
from flask import make_response
from flask import request
from flask_cors import CORS
from ctypes import *
import ctypes
lib = cdll.LoadLibrary("./a.so")
lib.getMessage.restype = c_char_p
print(lib.getMessage())
//a.go
package main
import "C"
//export getMessage
func getMessage() *C.char {
return C.CString("hello from go")
}
Он вернется: b'привет из go'
Это именно то, что я делаю. Но я получаю другой вывод
первый комментарий показывает гораздо более простую версию, которая работает почти из коробки
Я пытался. Но не может заставить его работать. Он возвращает странный символ для меня
Что такое decryptedMsg
? Можете ли вы опубликовать весь или хотя бы соответствующий исходный код?
@EndreSimo Вы можете посмотреть компактную версию в конце
Будет напечатано:
b'hello from go'
.
Это совершенно нормально. Строки C имеют тип, основанный на байтах.
В Python 2 типы bytes
и str
одинаковы, поэтому приложения Py2k видят строки C как строки. В Python 3 тип bytes
отличается от типа str
. Чтобы преобразовать bytes
в str
, вы должны декодировать его в соответствии с его кодировкой. В общем, вы можете попытаться вообще избежать его декодирования, если это возможно, но если оно должно быть декодировано, вы должны сообщить декодеру Python, как оно было закодировано:
print(lib.getMessage().decode('utf-8'))
например. (Сам Go использует кодировку utf-8, но другие элементы C могут не использовать какую-либо разумную кодировку.)
помогает ли это gist.github.com/helinwang/4f287a52efa4ab75424c01c65d77d939?