3

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;
    }
  }
3
  • 1
    'sizeof(text)' is sizeof(a pointer) Commented Jun 10, 2018 at 10:39
  • 1
    You have to pass array size as a separate parameter. Commented Jun 10, 2018 at 10:59
  • 1
    for (int j = 0; i < sizeof(text)/4; i++) { i or j ? Commented Jun 10, 2018 at 12:34

1 Answer 1

1

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);
    }
  }
}

Live Demo on wandbox

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.

Sign up to request clarification or add additional context in comments.

1 Comment

@user8747585 You are welcome. - I've to admit that I did oversee some little bugs which I realized when I prepared an MCVE. Now, it is fixed.

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.