Невозможно преобразовать указатель char в целое число

У меня есть функция, которой указатель char передается в качестве входных данных. Когда я принимаю ввод, переданный указателем char, на беззнаковый char, он отлично работает. Но unsigned char имеет длину 1 байт, поэтому я мог принимать только те значения, длина которых составляет один байт. Но теперь мне нужно ввести ввод длиной 4 байта в переменную.

Моя функция:

void charPointer (char* aBinary)
{
    unsigned char aByte = '\0';

    memcpy(&aByte, &(aBinary[0]), 1);

    m1 = static_cast<short>(aSingleByte);
}

Как мне это сделать?


person Prats    schedule 05.11.2013    source источник
comment
Использование memcpy здесь совершенно не нужно. Вы перезаписываете только один символ, просто выполните aBinaryIPAddress[0] = '\0';.   -  person Zac Howland    schedule 05.11.2013
comment
int mIPv4_1 = (int)aSingleByte; вам даже не нужно бросать. почему вы используете memcpy для копирования одного байта?   -  person SHR    schedule 05.11.2013


Ответы (3)


Это достаточно просто

unsigned char fourBytes[4];
memcpy(fourBytes, aBinaryIPAddress, 4);
person john    schedule 05.11.2013
comment
Это дает мне ошибку: ошибка: неверное преобразование из unsigned char*' to int' - person Prats; 05.11.2013
comment
Пожалуйста, взгляните на РЕДАКТИРОВАТЬ - person Prats; 05.11.2013
comment
лучше использовать hton(), если порядок байтов неизвестен - person SHR; 05.11.2013
comment
@SHR Нет, неизвестно - person Prats; 05.11.2013

взгляните на этот пример: функция 'f' берет 4 байта из буфера и возвращает их как целое число.

Результат cout будет 4030201 с прямым порядком байтов,

На машине с обратным порядком байтов это будет 1020304.

#include <iostream>

int f(char* buff)
{
    int &n=*(int*)buff;
    return n;
}

int main()
{
    char buff[20]={1,2,3,4,5};

    std::cout<<std::hex<<f(buff)<<std::endl;

    return 0;
}
person SHR    schedule 05.11.2013
comment
Я не хочу, чтобы решение было специфичным для машины, пожалуйста, дайте мне решение, которое не зависит от машины. - person Prats; 05.11.2013

В вашем случае можно попробовать следующее.

int abc = *((const int *)fourBytes);

Однако, если порядок байтов fourBytes отличается, вам необходимо вручную скопировать каждый байт в целое число, как показано ниже.

int addr;
addr = 0;
addr = aBinaryIPAddress[0];
addr = (addr << 8)|aBinaryIPAddress[1];
addr = (addr << 8)|aBinaryIPAddress[2];
addr = (addr << 8)|aBinaryIPAddress[3];

Вы также можете сделать это следующим образом

int addr;
memcpy(&addr, aBinaryIPAddress, numbytes); //numbytes = 4

Обратите внимание, что short имеет длину 2 байта.

person doptimusprime    schedule 05.11.2013
comment
Это дает мне ошибку: ошибка: неверное преобразование из unsigned char*' в int' - person Prats; 05.11.2013
comment
Пожалуйста, взгляните на РЕДАКТИРОВАТЬ - person Prats; 05.11.2013
comment
@Prats: Пожалуйста, посмотрите отредактированный ответ. Я надеюсь, что это может помочь вам. - person doptimusprime; 06.11.2013