байтовый массив к короткому - PullRequest
1 голос
/ 06 августа 2010

У меня целочисленное значение.

data[0]=0;
data[1]=0;
data[2]=(val>>8)%256;
data[3]=val%256;

Как мне сделать опосит? Как мне взять int из массива char?

Ответы [ 5 ]

5 голосов
/ 06 августа 2010

Для данных без знака:

val = (data[2] << 8) | data[3];

Для подписанных данных:

val = ((data[2] << 8) & 0xff00) | (data[3] & 0xff);
0 голосов
/ 06 августа 2010

Вы всегда можете попробовать союз:

typedef union {
    int      i;
    uint8_t  bytes[sizeof(int)];
} int_u;

Вы можете использовать это, чтобы превратить int в байты или наоборот. Однако следует помнить о проблемах с порядком байтов, если вы используете это для передачи данных между платформами.

0 голосов
/ 06 августа 2010
Мод

- довольно дорогая операция, особенно для сохранения 32-битного int. Вы, вероятно, просто хотите memcpy. Если вы беспокоитесь о переносимости, добавьте htonl:

#include<string.h>

uint32_t x = 12;
char data[4];
memcpy(data, &x, sizeof(x)); 

Чтобы пойти другим путем, вы можете просто повернуть его вспять:

memcpy(&x, data, sizeof(x));
0 голосов
/ 06 августа 2010

Простой способ:

int myint = mybyte[0]<<24+mybyte[1]<<16+mybyte[2]<<8+mybyte[3];

Предполагая, что это ваш битовый порядок, и все они без знака. Возможно, вам придется преобразовать байты в целые, чтобы убедиться, что они не переносятся (11001100 -> 11001100,0000000 вместо 11001100).

Более странный способ (хотя, вероятно, быстрее) был бы чем-то сомнительным с указателями:

int * myintp= mybyte;
int myint = *myintp;

Я вообще не проверял это, но теоретически это должно работать, предполагая, что длины работают, и т. Д. Это все еще, вероятно, не очень хорошая идея.

0 голосов
/ 06 августа 2010

Просто переберите элементы и выполните Int.Parse

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...