我正在尝试将整数转换为字节(也称为无符号字符)数组,以在C++中通过TCP流发送该数组,反之亦然。

我已经尝试过许多关于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";

最佳答案

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

因此,函数返回后立即丢弃该值,并且所有调用者收到的都是指向现在无效位置的指针-值超出范围时销毁,并且指针不会延长该生存期。

使用标准容器对象(例如std::arraystd::vector),您的函数应将其返回给调用者,或者让intToByte接受byte[4] / byte*作为参数并填写。

为了完整起见,您还可以让该函数使用new创建字节数组,但随后您必须记住对其进行delete[]编码,尽管在这种情况下这似乎很容易,但是当您拥有没有充分的理由进行动态分配。

另外,语句x & y >> z将首先执行y >> z,然后将其与x按位与,这当然不是您想要的。

09-28 06:59