سؤال

لقد قمت بإنشاء كائن عازلة في بيثون مثل ذلك:

f = io.open('some_file', 'rb')
byte_stream = buffer(f.read(4096))

أنا الآن أمر byte_stream كمعلمة لوظيفة C ، من خلال swig. لديّ خريطة خريطة لتحويل البيانات التي تشبه هذا:

%typemap(in) unsigned char * byte_stream {
    PyObject *buf = $input;
    //some code to read the contents of buf
}

لقد جربت بعض الأشياء المختلفة التي لا يمكن أن تصل إلى المحتوى/القيمة الفعلية لـ Byte_stream. كيف يمكنني تحويل محتوى أو الوصول إلى محتوى byte_stream باستخدام C API؟ هناك العديد من الطرق المختلفة لتحويل بيانات C إلى مخزن مؤقت ، لكن لا شيء يمكنني العثور عليه للذهاب في الاتجاه الآخر. لقد حاولت النظر إلى هذا الكائن في GCB ولكن لا ، أو القيم التي يشير إليها لاحتواء بياناتي.

(أنا أستخدم المخازن المؤقتة لأنني أريد تجنب النفقات العامة لتحويل البيانات إلى سلسلة عند قراءتها من الملف) أنا أستخدم Python 2.6 على Linux.

- شكرا بافيل

هل كانت مفيدة؟

المحلول

أنا أستخدم المخازن المؤقتة لأنني أريد تجنب النفقات العامة لتحويل البيانات إلى سلسلة عند قراءتها من الملف

أنت لا تتجنب أي شيء. تم تصميم السلسلة بالفعل بواسطة read() طريقة. الدعوة buffer() فقط يبني كائن عازلة إضافي يشير إلى تلك السلسلة.

أما بالنسبة للوصول إلى الذاكرة التي أشار إليها الكائن العازلة ، حاول PyObject_AsReadBuffer(). أنظر أيضا http://docs.python.org/c-api/Objbuffer.html.

نصائح أخرى

بمجرد استخدامك read الطريقة في كائن الملف الخاص بك ، سيتم تحويل البيانات إلى أ str هدف؛ استدعاء buffer الطريقة لا يحولها إلى دفق من أي نوع. إذا كنت ترغب في تجنب النفقات العامة لإنشاء كائن السلسلة ، فيمكنك ببساطة تمرير كائن الملف إلى رمز C الخاص بك ثم استخدامه عبر API C.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top