I'm working on IJVM project using C language. First, I imported a binary file into my program, which should be parsed as words. Now I made a variable (text) which contains the binary and I need to convert it into an array of words. I got a hint
int result = ((bytes[0] & 0xFF) << 24) |
((bytes[1] & 0xFF) <<16) |
((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF);
This worked only for the first 4-bytes, What I need is an array of result
.
I tried something like this, but it never worked .. :(
void type_converter(byte_t* text)
{
for (int i = 0; i < sizeof(text)/4; i++) {
for (int j = 0; i < sizeof(text)/4; i++) {
int result[i] = ((text[j+0] & 0xFF) << 24) |
((text[j+1] & 0xFF) << 16) |
((text[j+2] & 0xFF) << 8) | (text[j+3] & 0xFF);
instruction[i] = result;
j =+ 4;
}
}
About OP's code sample:
The inner loop doesn't make sense (or I didn't understand the intention).
The outer loop, I would change to: for (int i = 0; i + 3 < size; i += 4)
. Please, note the i + 3
. It makes the loop safe against a partial amount of bytes at end of buffer. The i += 4
makes the appropriate step in 4 byte jumps.
The size
is something you have to provide. As Martin already mentioned: sizeof text
provides the size of the pointer. There is no chance to determine this by an operator (if you don't have direct access to original array). You should make a parameter size
for this. (This is a very common solution in C programs.)
Btw. there is no declaration for result
or instruction
. Hence, I would make one of them as another parameter of function.
So, your change function could look like this:
void type_converter(uint32_t *result, byte_t *text, size_t size)
{
for (size_t i = 0; i + 3 < size; i += 4) {
result[i / 4]
= ((text[i+0] & 0xFF) << 24)
| ((text[i+1] & 0xFF) << 16)
| ((text[i+2] & 0xFF) << 8)
| (text[i+3] & 0xFF);
}
}
}
And, please, don't forget that result
has to provide enough storage for size / 4
uint32_t
words.
As I just remembered how I did similar things in the past, this can be a little bit changed to prevent the i + 3
in loop condition:
void type_converter(uint32_t *result, byte_t *text, size_t size)
{
for (size_t i = 3; i < size; i += 4) {
result[i / 4]
= ((text[i-3] & 0xFF) << 24)
| ((text[i-2] & 0xFF) << 16)
| ((text[i-1] & 0xFF) << 8)
| (text[i] & 0xFF);
}
}
}
Note:
I just realized that this kind of byte combination is for big-endian numbers (highest byte in first position). For little-endian the indices had to be re-ordered.