Hướng dẫn convert c struct to python - chuyển đổi c struct thành python

Bộ chuyển đổi cấu trúc C2Py

Nhập các kết xuất bộ nhớ vào các lớp Python được tạo theo các chuỗi C được xác định, tăng tốc thử nghiệm gỡ lỗi và tự động hóa.

Nó làm gì?

C2Py ở đây để giúp bạn chuyển đổi các cấu trúc và công đoàn C của mình thành các lớp Python với cùng các trường, loại tên và mọi thứ! Đó không phải là tất cả. C2Py có thể nhận được một bộ đệm của các byte hoặc kết xuất bộ nhớ để gán cho các trường của cấu trúc!

Tại sao sử dụng nó?

Dự án này rất có thể được sử dụng để kiểm tra tự động hóa cho các dự án C. Một cách sử dụng khác có lẽ là gỡ lỗi - đọc và hiểu một kết xuất bộ nhớ tốt hơn bằng cách nhập nó vào các lớp giống như cấu trúc có thể đọc được.

Cài đặt

Gói này yêu cầu Python 3.* Chỉ cần tải xuống dự án này, mở CMD hoặc thiết bị đầu cuối và nhập:

  python /path/to/C2Py/setup.py install

Và bạn đã xong!

Sử dụng & ví dụ

Như đã đề cập trước đây, gói này là để hỗ trợ các nhà phát triển C sử dụng mô -đun CTYPES bằng cách tự động phân tích cú pháp [và dân cư] các cấu trúc của chúng. Điều này được thực hiện chỉ đơn giản bằng cách cung cấp các tệp nguồn [tệp trung gian hoặc các tệp *.i - nhiều hơn về sau đó] và [tùy chọn] tệp dữ liệu nhị phân hoặc mảng byte để cung cấp dữ liệu để gán cho các cấu trúc/công đoàn được phân tích cú pháp.

struct my_struct {
  int a;
  char c;
};
...

// Instance of my_struct, later saved into a binary file
struct my_struct instance;
instance.a = 5;
instance.c = 'o';

Và chuyển đổi [giả sử có một tệp nhị phân với dữ liệu đã lưu từ C Struct đã đề cập]:

import C2PyHandler
binary_file_handler = C2PyHandler.DefaultBinaryFileC2PyHandler["path\\to\\SourceIntermediate.i", "path\\to\\binaryfile"]
result_struct = binary_file_handler.convert[struct_declaration="my_struct"]
print[result_struct.a] # Prints 5
print[result_struct.b] # Prints 'o'

API khá đơn giản:

  1. Tạo một thể hiện mới của người xử lý bạn lựa chọn:
  • DefaultBinaryFileC2PyHandler - để điền vào các cấu trúc được chuyển đổi với dữ liệu từ các tệp nhị phân.
  • DefaultNobufferC2PyHandler - để tạo các cấu trúc được chuyển đổi với tất cả các giá trị được khởi tạo là 0.
  • Defaultruntimebufferc2phandler - để điền vào các cấu trúc được chuyển đổi với dữ liệu được cung cấp trong thời gian chạy [tốt nhất là thông qua 'bytearray']]
  • Tạo trình xử lý tùy chỉnh của riêng bạn bằng cách ghi đè lên "Tóm tắt" 'C2PyStructSabshandler'. Lớp này có một phương thức không được thực hiện: '_READ_FROM_MEMORY', mà người ta phải ghi đè nên viết một người xử lý tùy chỉnh.
  1. Gọi phương thức 'Chuyển đổi' với các tham số thích hợp. Xin lưu ý rằng các tham số khác nhau có thể được yêu cầu, tùy thuộc vào người xử lý được sử dụng.

Để biết thêm các ví dụ và cách làm, vui lòng tham khảo mô-đun và mã nguồn Test.Py được tìm thấy trong thư mục 'Kiểm tra'.

Các tệp trung gian C2Py có thể nhận các tệp .h hoặc .c, nhưng nó hoạt động tốt nhất với các tệp .i. Điều này là do C2Py không phân tích các macro [#Define ...], mà là các tệp trung gian hoặc các tệp được xử lý trước, là các tệp được tạo trong quá trình biên dịch và xóa sau đó. Chúng thường không được sử dụng bởi nhà phát triển C trung bình. Đừng lo lắng nếu bạn chưa bao giờ nghe nói về họ [tôi chưa bắt đầu làm việc với dự án này]. Tất cả những gì bạn cần làm là thêm một cờ vào quy trình biên dịch của bạn để giữ các tệp này. Nếu bạn đang sử dụng GCC, bạn có thể sử dụng Makefile trong 'Kiểm tra' để tham khảo. C2Py could receive .h or .c files, but it works best with .i files. This is because C2Py does not parse macros [#define ...], but intermediate files, or preprocessed files, are files which are generated during compilation and deleted afterwards. They aren't normally used by the average C developer. Don't worry if you've never heard of them [I haven't till I started working on this project]. All you need to do is add a flag to your compilation process to keep these files. If you're using gcc you may use the Makefile under 'tests' for reference.

Xét nghiệm

Tất cả các tệp liên quan đến thử nghiệm có thể được tìm thấy trong thư mục 'Kiểm tra'. Gói này đi kèm với các tệp và tiêu đề nguồn C, được sử dụng cùng với thử nghiệm Python.

Biên dịch mã kiểm tra C yêu cầu và chạy thử nghiệm có thể được thực hiện trong một dòng, như vậy [trong ví dụ này, chúng tôi đang ở thư mục gốc của kho lưu trữ C2Py].

cd C2Py/tests/ && make && ./generateTestData.exe && cd ../../ && python3 -c 'import C2Py.tests.test as test; test.run_test[]'

Để biên dịch và nhận các tệp có liên quan:

  1. Chạy lệnh 'Tạo' khi trong thư mục 'Kiểm tra' [điều này yêu cầu có trình biên dịch như cài đặt GCC].

Lưu ý quan trọng Vui lòng sử dụng đảm bảo biên dịch với phiên bản GCC phù hợp [32 hoặc 64 bit] phù hợp với phiên bản thực thi Python đã cài đặt của bạn. Nếu không, một số loại biến có thể ở các kích thước khác nhau và kết xuất bộ nhớ có thể không được đọc chính xác.

Sau khi biên dịch, bạn sẽ thấy ba tệp đã được tạo: Source.i, SecondFile.I, GeneratetestData.exe.

  1. Chạy thực thi để tạo một tệp nhị phân mà bài kiểm tra sẽ đọc. Nên được đặt tên là 'đầu ra'.

  2. Trong bảng điều khiển Python, chạy như sau:

    import C2Py.tests.test as test
    test.run_test[]

    Mong đợi đầu ra thử nghiệm cho bảng điều khiển. Tất cả các bài kiểm tra nên vượt qua.

Gói này đã được thử nghiệm với GCC 4.9.2, Python 3.8.5

Không được hỗ trợ [cũng sẽ không]

Rất tiếc, một số tính năng tiềm năng sẽ không được hỗ trợ bởi gói này:

  • Tạo ra một mảng các cấu trúc \ công đoàn. Tham số đầu tiên của Phương thức chuyển đổi sẽ chỉ nhận được tên khai báo cấu trúc hoặc tên typedef. Ví dụ, để tạo một mảng các cấu trúc trong khi điền chúng từ tệp nhị phân, chỉ cần sử dụng một vòng lặp và tham số 'offset' trong 'chuyển đổi []' để truy cập đúng phần bộ nhớ trong tệp.
  • Mảng char [hoặc chuỗi]. Tất cả các ký tự sẽ được coi là byte. Các byte có giá trị đại diện cho ký tự ASCII có thể đọc được [hiện được đặt giữa phạm vi từ 32 đến 126] sẽ được hiển thị dưới dạng ký tự. Tất cả các giá trị khác sẽ được hiển thị dưới dạng số nguyên trong biểu diễn HEX. Tất cả các mảng byte sẽ được hiển thị trong một biểu mẫu danh sách, không bao giờ là một chuỗi.

Người đóng góp

Sagie Levy

Giấy phép

Bản quyền [c] 2015 Phần mềm nhóm Tandem

Được cấp phép theo giấy phép Apache, phiên bản 2.0 ["giấy phép"]; Bạn không được sử dụng tệp này ngoại trừ tuân thủ giấy phép. Bạn có thể có được một bản sao giấy phép tại

//www.apache.org/licenses/LICENSE-2.0

Trừ khi theo yêu cầu của luật hiện hành hoặc đồng ý bằng văn bản, phần mềm được phân phối theo giấy phép được phân phối trên cơ sở "như là", không có bảo hành hoặc điều kiện dưới bất kỳ hình thức nào, thể hiện hoặc ngụ ý. Xem giấy phép cho các quyền và giới hạn ngôn ngữ cụ thể theo giấy phép.

Cấu trúc C tương đương trong Python là gì?

Mô -đun này thực hiện chuyển đổi giữa các giá trị python và các cấu trúc C được biểu thị dưới dạng các đối tượng byte python. Chuỗi định dạng là cơ chế được sử dụng để chỉ định bố cục dự kiến ​​khi đóng gói và giải nén dữ liệu.Python bytes objects. Format strings are the mechanism used to specify the expected layout when packing and unpacking data.

Làm thế nào để bạn giải nén một cấu trúc trong Python?

Hãy bắt đầu xem xét các chức năng mô -đun cấu trúc từng chức năng một ...
Cấu trúc Python.đóng gói[] ... .
Cấu trúc Python.Giải nén [] ....
Python struct calcsize [] Hàm này tính toán và trả về kích thước của biểu diễn chuỗi của cấu trúc với một định dạng đã cho.....
Python struct pack_into [], unpack_from [].

Chúng ta có thể sử dụng struct trong python không?

Cấu trúc mô -đun được sử dụng để chuyển đổi các loại dữ liệu gốc của python thành chuỗi byte và ngược lại.Chúng tôi không phải cài đặt nó.Đây là một mô-đun tích hợp có sẵn trong Python3.Mô -đun cấu trúc có liên quan đến các ngôn ngữ C.. We don't have to install it. It's a built-in module available in Python3. The struct module is related to the C languages.

Có phải cấu trúc trong C giống như lớp trong Python?

Không lấy các trang và trang để đi vào chi tiết, hãy nghĩ về một cấu trúc C như một cách để sắp xếp dữ liệu, trong khi một "lớp C ++ hoặc mục tiêu-C] là một cách để tổ chức không chỉ dữ liệu của bạn, mà là hoạt động của bạncho dữ liệu đó.think of a C struct as a way to organize data, while a Python [or C++ or Objective-C] "class" is a way to organize not only your data, but the operations for that data.

Bài Viết Liên Quan

Chủ Đề