محتويات الوصول من Pybuffer من ج
-
22-09-2019 - |
سؤال
لقد قمت بإنشاء كائن عازلة في بيثون مثل ذلك:
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.