开发者

Casting a character array into an integer

开发者 https://www.devze.com 2023-01-29 02:51 出处:网络
EDIT: The wrong type of num2 has been corrected. Hello, I have some character arrays of known size which contains raw integer data read from a binary file.

EDIT: The wrong type of num2 has been corrected.

Hello,

I have some character arrays of known size which contains raw integer data read from a binary file.

The size of all these arrays have the size of a integer.

I would like to ask whether the following operation is safe and accurate in ALL normal situation, assuming that the endianness of the raw data and the computer running this code agrees.

char arr1[4] = { ... };
char arr2[2] = { ... };

uint32_t num1 = *static_cast<uint32_t*>(arr1); /* OR num1 = *(uint32_t*)arr1 in C */
uint16_t num2 = *static_cast&开发者_开发问答lt;uint16_t*>(arr2); /* OR num2 = *(uint32_t*)arr2 in C */

Thank you!


You should use a union.

union charint32 {
    char arr1[4];
    uint32_t num;
};

This will simplify storage and casting for you.


It is technically safe, but there are a few things I would consider:

  • Add compile-time asserts to verify the sizes. Are you SURE that your char array equals sizeof(your_int_type)? Your num2 is a great example of why this is important - your typo would cause undefined behavior.
  • Consider the alignment. Are you sure that your char array is on a 4-byte boundary (assuming your int is 4 bytes)? PowerPC for example will crash if you try to read an int from an unaligned pointer.


This should be safe:

char arr1[4] = { ... };

uint32_t num1;

memcpy(&num1, arr1, sizeof num1);

But why is arr2 only 2 bytes big? Is that a typo?


A safer approach would be to use a macro (e.g. MAKEDWORD) to put the bytes in their proper order.


If you are sure the arrays are properly aligned, then there shouldn't be a problem (given the endianness).

In the code, however, I don't know what you're doing with arr2, since it is 16 bits, and you are reading a 32 bit quantity from it.


Yes, that should work fine (under your assumption of endianness), since the representation of these bytes in memory is the same regardless of whether it's interpreted as an array of bytes or an integer.

Really all you're doing is changing the type, not the data.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号