TagLibライブラリから大量のデータを読み込み、GoLang(mpeg画像データ)に渡しました。データがフェッチされるのはここ大きな文字ポインタを持つGolang CGO - SEGSERV
である:この時点で
void audiotags_mpeg_artwork(TagLib::MPEG::File *mpegFile, int id) {
TagLib::ID3v2::Tag *id3v2 = mpegFile->ID3v2Tag(false);
if (id3v2!=nullptr) {
const TagLib::ID3v2::FrameList frameList = id3v2->frameListMap()["APIC"];
for(auto it = frameList.begin(); it != frameList.end(); it++) {
TagLib::ID3v2::AttachedPictureFrame * frame = (TagLib::ID3v2::AttachedPictureFrame *)(*it);
if (frame!=nullptr && frame->size() > 0) {
const auto &apicBase64 = frame->picture().toBase64();
auto len = apicBase64.size();
if (len > 0) {
// Generate memory for key
char* key = new char[5];
memcpy(key, "APIC", 4);
key[4]='\0';
// Generate memory for picture data
char* val = new char[len];
memcpy (val, apicBase64.data(), len);
// Send to GoLang
go_map_audiotags(id, key, val);
// Free memory
delete[] key;
delete[] val;
}
}
}
}
}
、作品(私は他のデータのための類似の方法を使用する)go_map_autotags。これはまた、他の画像データのために働くしかし、サイズに応じて、これはとクラッシュします:GoLang内
unexpected fault address 0x766a000
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x1 addr=0x766a000 pc=0x404530b]
、私は次のエクスポートがあります
//export go_map_audiotags
func go_map_audiotags(id C.int, key *C.char, val *C.char) {
m := maps[int(id)]
k := strings.ToLower(C.GoString(key))
log.Println("go_map_audiotags k:", k) // <--- works
v := C.GoString(val) // <--- crashes
log.Println("go_map_audiotags v:", v) // <--- Does not reach
m[k] = v
}
を私が輸送されなければならないベティの方法はありますこのデータは? C++はval
に格納されたデータは、NULLで終了ではありませんGoLang
'apicBase64.data()'はヌル終了ですか? – tkausl
@tkauslこれを確認するにはどうすればよいでしょうか? taglibドキュメントによると: フレーム - >絵():http://taglib.org/api/classTagLib_1_1ID3v2_1_1AttachedPictureFrame.html#afd21599ba7fa9a237ec5f1f1cad78e24 ByteVector.data():http://taglib.org/api/classTagLib_1_1ByteVector.html# a55d40ed1e9b9749e3895c845f1f26901 – Stoyvo
Nul-あなた自身で終了し、それでもクラッシュするかどうかを確認してください。 – tkausl