0

I have function in C that reads byte by byte from a given buffer and returns the result of a mathematical formula.
I need to write the same function in Python

The buffer in C is struct and in python i used ctypes Structure class
my prototype in c is int calc_formula(char *buff,int len)
so calling the function in c is staright forward but how i define such function in Python?

I try to define the following and have some questions

def calc_formula(buff,len):
    some code
  1. In C I called the function with pointer to the strcut first char. How do I do it in Python? is buff passed as pointer? My buffer is very large and if it can't be done, I will use global variable (which is less preferred).
  2. I need to read the buffer byte by byte, so in c I simply increment the buffer pointer. What's the way to do it in python? I read about ctypes union class that I can define over the Structure and go over it byte by byte. Do you have a better solution?

UPDATE

i tried bbrame solution :

def calc_formula(buff, len):
    sum = 0     
    for curChar in buff: 
        numericByteValue = ord(curChar) 
        sum += numericByteValue     
    return sum 

with When i try its code with calc_formula(input_buff,len) , i get the following:
"*error:TypeError: 't_input_buff' object is not iterable*" - input_buff is instance of t_input_buff that is Class(Structure) . what can be the problem? (it give me the error when it try to do the for command)

5
  • ctypes is used to call C functions from Python. But you also talk about rewriting a C function in Python. Which of these do you need to do? Commented Nov 30, 2011 at 14:21
  • Just thought to check: are you aware of the existence of NumPy and SciPy, the high-performance numeric extensions of python? I'm asking because from the look of it it seems that using a numpy.ndarray would allow for a straightforward solution... Again: I'm not suggesting you are doing it wrong... just checking if you knew this other possibility! :) Commented Nov 30, 2011 at 14:23
  • 2
    This is why you translate algorithms, not code. Commented Nov 30, 2011 at 14:25
  • @interjay , i used ctypes in order to define memory layout as same as my C program that is embedded software. i used this same memory layout to read the memory as whole block from the board and easily access each member in Python. so my question is how to write the function in python Commented Nov 30, 2011 at 14:38
  • thanks @mac , i'm not aware of these extensions (i'm newbie in python) Commented Nov 30, 2011 at 14:55

2 Answers 2

1

In c, try using the type c_char_p rather than char* (see the ctypes documentation).

In python the parameter (buff) will be a python string. Loop through it as follows:

def calc_formula(buff, len):
    sum = 0
    for curChar in buff:
        numericByteValue = ord(curChar)
        sum += numericByteValue
    return sum
Sign up to request clarification or add additional context in comments.

2 Comments

what you meant by "In c, try using the type c_char_p rather than char* ? ctypes c_char_p is ctypes type not C type (that's why i used char*)
,When i try your code with calc_formula(input_buff,len) , i get the following "error:TypeError: 't_input_buff' object is not iterable" i' - input_buff is instance of t_input_buff that is Class(Structure) . what can be the problem?
0

UPDATE i solve it with ctypes union class
for answer look in this question

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.