C ++ |将int转换为byte [4],反之亦然

时间:2016-11-03 11:58:45

标签: c++ arrays integer byte endianness

我试图将整数转换为字节(也称为unsigned char)数组,以通过C ++中的TCP Stream发送数组,反之亦然。

我已尝试过很多关于stackoverflow和自己想法的解决方案,但似乎没有什么对我有用。

我的上一个解决方案如下:

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include "tcpconnector.h"

typedef unsigned char byte;

using namespace std;

/*
char* byteToChar(byte* b, int length) {
    char c[length];
    for (int i = 0; i < length; i++) {
    c[i] = b[i] - 128;
    }
    return c;
}

byte* charToByte(char* c, int length) {
    byte b[length];
    for (int i = 0; i < length; i++) {
    b[i] = c[i] + 128;
    }
    return b;
}
*/

byte* intToByte(int n) {

    byte byte[4];

     byte[0] = n & 0x000000ff;
     byte[1] = n & 0x0000ff00 >> 8;
     byte[2] = n & 0x00ff0000 >> 16;
     byte[3] = n & 0xff000000 >> 24; 

     return byte;
}

int byteToInt(byte* byte) {

    int n = 0;

    n = n + (byte[0] & 0x000000ff);
    n = n + ((byte[1] & 0x000000ff) << 8);
    n = n + ((byte[2] & 0x000000ff) << 16);
    n = n + ((byte[3] & 0x000000ff) << 24);


    return n;
}

int main(int argc, char** argv)
{
    if (argc != 3) {
        printf("usage: %s <port> <ip>\n", argv[0]);
        exit(1);
    }

    int number = 42;
    byte* line = intToByte(number);

    cout << "Number: " << number << "\n";
    cout << "ArrayLength: " << sizeof line << "\n";
    cout << "Array: " << line << "\n";
    cout << "Array to Number: " << byteToInt(line) << "\n";

/*

    TCPConnector* connector = new TCPConnector();
    TCPStream* stream = connector->connect(argv[2], atoi(argv[1]));
    if (stream) {
        stream->send(byteToChar(line, 4), 4);
        delete stream;
    }

*/
    exit(0);
}

每次执行此代码时,无论我将其设置为“int number”,我都会得到结果“4202308”。

任何帮助都将不胜感激。

更新:

void intToByte(int n, byte* result) {

     result[0] = n & 0x000000ff;
     result[1] = n & 0x0000ff00 >> 8;
     result[2] = n & 0x00ff0000 >> 16;
     result[3] = n & 0xff000000 >> 24; 
}

摘自main():

int number = 42;
byte line[4];
intToByte(number, line);

cout << "Number: " << number << "\n";
cout << "ArrayLength: " << sizeof line << "\n";
cout << "Array: " << line << "\n";
cout << "Array to Number: " << byteToInt(line) << "\n";

3 个答案:

答案 0 :(得分:2)

您的intToByte函数正在其正文范围内分配byte[4],然后返回指向它的指针。

因此,一旦函数返回并且所有调用者接收到的是指向现在无效位置的指针,该值就会被删除 - 当值超出范围且指针不延长该生命周期时,值将被销毁。

使用标准容器对象,例如std::arraystd::vector,您的函数应该返回给调用方,或者intToByte接受byte[4] / {{1作为一个参数并填写它。

为了完整性......你也可以让函数使用byte*创建字节数组,但是你必须记住它new,这虽然看起来很容易在这种情况下,当你没有充分的理由进行动态分配时,这通常是不好的做法。

此外,语句delete[]将首先执行x & y >> z然后按位 - 并且结果为y >> z,这当然不是您想要的。

答案 1 :(得分:1)

第一点: 您从byte* intToByte(int n)返回的缓冲区不安全。 您将返回本地数组的基址。将字节数组作为输入传递或在堆中分配字节并返回地址

第二点:

考虑运营商优先级。

 byte byte[4];
 byte[0] = n & 0x000000ff;
 byte[1] = ( n & 0x0000ff00 ) >> 8;
 byte[2] = ( n & 0x00ff0000 ) >> 16;
 byte[3] = ( n & 0xff000000 ) >> 24; 

答案 2 :(得分:0)

不幸的是,这不是您问题的准确答案,但可能会有所帮助。你可以像我想的下面的代码那样做。

#include <stdio.h>
using namespace std;

unsigned char* intToByte(const int& N) {

    unsigned char* byte = new unsigned char[4];

    byte[0] = (N >> 24) & 0xFF;
    byte[1] = (N >> 16) & 0xFF;
    byte[2] = (N >> 8) & 0xFF;
    byte[3] = N & 0xFF;

    return byte;
}


int main()
{
    unsigned char * result = intToByte(255);
    printf("%x %x %x %x\n", (unsigned char)result[0], (unsigned char)result[1],
                            (unsigned char)result[2], (unsigned char)result[3]);

    delete result;
    return 0;
}