C++ int到byte数组

jus*_*me_ 26 c++ arrays int byte

我在我的java代码中有这个方法,它返回给定int的字节数组:

private static byte[] intToBytes(int paramInt)
{
     byte[] arrayOfByte = new byte[4];
     ByteBuffer localByteBuffer = ByteBuffer.allocate(4);
     localByteBuffer.putInt(paramInt);
     for (int i = 0; i < 4; i++)
         arrayOfByte[(3 - i)] = localByteBuffer.array()[i];
     return arrayOfByte;
}
Run Code Online (Sandbox Code Playgroud)

有人可以给我提示如何将该方法转换为C++?

Jam*_*lis 51

你不需要一个完整的功能; 一个简单的演员就足够了:

int x;
static_cast<char*>(static_cast<void*>(&x));
Run Code Online (Sandbox Code Playgroud)

C++中的任何对象都可以重新解释为字节数组.如果要将字节的副本实际复制到单独的数组中,可以使用std::copy:

int x;
char bytes[sizeof x];
std::copy(static_cast<const char*>(static_cast<const void*>(&x)),
          static_cast<const char*>(static_cast<const void*>(&x)) + sizeof x,
          bytes);
Run Code Online (Sandbox Code Playgroud)

这些方法都没有考虑字节顺序,但由于您可以将字符串重新解释int为字节数组,因此自行执行任何必要的修改都是微不足道的.

  • @PaulH:迷信.这两种方法都应该有效. (5认同)
  • 我很好奇:你为什么要做两个`static_cast <>`而不是一个`reinterpret_cast <>`? (4认同)
  • 详细说明:一两年前在这里进行了长时间的讨论,讨论是否保证“ reinterpret_cast”等同于“ static_cast”对。如果我没记错的话,基本上都同意两者都应该正常工作,但是这一切都令人费解,所以我仍然避免使用“ reinterpret_cast”。 (2认同)
  • 将 int 转换为字节数组是否定义良好?我认为像访问其他类型一样访问对象是未定义的行为。 (2认同)

Don*_*alo 21

使用std::vector<unsigned char>:

#include <vector>
using namespace std;

vector<unsigned char> intToBytes(int paramInt)
{
     vector<unsigned char> arrayOfByte(4);
     for (int i = 0; i < 4; i++)
         arrayOfByte[3 - i] = (paramInt >> (i * 8));
     return arrayOfByte;
}
Run Code Online (Sandbox Code Playgroud)

  • Java代码生成一个大端表示; 你会产生一个小家伙.(我也只使用移位计数作为循环控制:`int i = 32; while(i!= 0){arrayOfByte [i] = paramInt >> i; i - = 8;}` (3认同)

Nul*_*ata 12

我使用的另一个有用的方法是工会:

union byteint
{
    byte b[sizeof int];
    int i;
};
byteint bi;
bi.i = 1337;
for(int i = 0; i<4;i++)
    destination[i] = bi.b[i];
Run Code Online (Sandbox Code Playgroud)

这将使字节数组和整数"重叠"(共享相同的内存).这可以用各种类型完成,只要字节数组与类型相同(否则其中一个字段不会受到另一个字段的影响).当你必须在整数操作和字节操作/复制之间切换时,将它们作为一个对象也很方便.

  • 从错误的工会成员那里读是未定义的行为和滥用工会 (4认同)
  • 这是错误的。这不是工会的目的。这不是工会的运作方式。神话! (2认同)
  • 在某些机器上,这非常聪明,但遗憾的是它不是标准的,而且很危险。请参阅[此联合参考](https://en.cppreference.com/w/cpp/language/union)。“联合的大小仅与容纳其最大数据成员所需的大小相同。其他数据成员作为该最大成员的一部分分配在相同的字节中。**该分配的细节是实现定义的,并且它是未定义的行为从不是最近写入的联合成员中读取。** 许多编译器作为非标准语言扩展实现了读取联合非活动成员的能力。 (2认同)

Bla*_*ear 5

您可以通过anding和shift操作获得单个字节:

byte1 =  nint & 0x000000ff
byte2 = (nint & 0x0000ff00) >> 8
byte3 = (nint & 0x00ff0000) >> 16
byte4 = (nint & 0xff000000) >> 24
Run Code Online (Sandbox Code Playgroud)


Jam*_*nze 5

std::vector<unsigned char> intToBytes(int value)
{
    std::vector<unsigned char> result;
    result.push_back(value >> 24);
    result.push_back(value >> 16);
    result.push_back(value >>  8);
    result.push_back(value      );
    return result;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

Int到byte,反之亦然.

unsigned char bytes[4];
unsigned long n = 1024;

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

printf("%x %x %x %x\n", bytes[0], bytes[1], bytes[2], bytes[3]);


int num = 0;
for(int i = 0; i < 4; i++)
 {
 num <<= 8;
 num |= bytes[i];
 }


printf("number %d",num);
Run Code Online (Sandbox Code Playgroud)


Spo*_*ice 5

int(或任何其他数据类型)已经作为字节存储在内存中。那么为什么不直接复制内存呢?

memcpy(arrayOfByte, &x, sizeof x);
Run Code Online (Sandbox Code Playgroud)

一个简单优雅的单行代码,也适用于任何其他数据类型。



如果您需要反转字节,您可以使用 std::reverse

memcpy(arrayOfByte, &x, sizeof x);
std::reverse(arrayOfByte, arrayOfByte + sizeof x);
Run Code Online (Sandbox Code Playgroud)

或者更好的是,只需反向复制字节即可

BYTE* p = (BYTE*) &x;
std::reverse_copy(p, p + sizeof x, arrayOfByte);
Run Code Online (Sandbox Code Playgroud)

如果您根本不想复制数据,而只想使用其字节表示

BYTE* bytes = (BYTE*) &x;
Run Code Online (Sandbox Code Playgroud)