CGo Преобразование go строки в *C .uchar - PullRequest
0 голосов
/ 20 января 2020
var originalMsg *C.uchar
C.ecall_pay_w(8, 10, &originalMsg, &signature)
originalMsgStr := fmt.Sprintf("%c", originalMsg)

//Todo convert originalMstStr to same value with originalMsg

Мне нужно преобразовать go str (originalMsgStr) в тип *C .uchar, который совпадает со значением originalMsg. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Вы получаете строку C от вашего звонка до C.ecall_pay_w и хотите преобразовать эту строку C в строку Go. Вы можете сделать это вручную, следуя по C -строке, пока не достигнете окончания 0.

При условии, что:

  • В конце есть окончание 0 C -строки
  • C -строка кодируется как ASCII, поэтому каждый байт представляет символ ASCII (в диапазоне [0..127]). Это означает, что это ASCII и UTF-8 одновременно, потому что UTF-8 обратно совместим с ASCII.

Тогда ваше решение может быть таким:

    func convertCStringToGoString(c *C.uchar) string {
        var buf []byte
        for *c != 0 {
            buf = append(buf, *c)
            c = (*C.uchar)(unsafe.Pointer(uintptr(unsafe.Pointer(c)) + 1))
        }
        return string(buf)
    }

Примечание что делать "небезопасные" вещи, подобные этой, в Go очень тяжело Это было сделано специально 1030 * авторами. Вам нужно конвертировать в unsafe.Pointer, прежде чем вы сможете конвертировать в uintptr. uintptr можно добавить к (+ 1), в то время как unsafe.Pointer не поддерживает это. Вот причины такого большого количества кастингов.

0 голосов
/ 20 января 2020

Я не знаю Go в деталях, но не забывайте, что в C *C.uchar будет что-то вроде unsigned char *, который часто используется для ссылки на строку (массив символов с нулевым символом в конце) .

Здесь вы используете fmt.Sprintf("%c", originalMsg), с %c, который ожидает один символ, так что кроме языковых подробностей о том, как вы приведете полученную строку к *C.uchar, вы, скорее всего, уже потеряли содержимое .

% c символ, представленный соответствующей кодовой точкой Unicode

С https://golang.org/pkg/fmt/#hdr -Печать

...