Operaciones de byte a byte en tipos nativos de múltiples bytes de manera idiomática.
En lenguaje C, sin dudarlo, escribiría lo siguiente:
uint32_t value = 0xDEADBEEF;
uint8_t *pValue = &value;
for (size_t i = 0; i < sizeof(value); i++)
{
pValue[i] ^= 0xAA;
}
Pero en C++17 me enfrento a dos restricciones de mi analizador de código:
– Usar “std::byte” para el acceso a memoria orientado a bytes.
– Reemplazar “reinterpret_cast” con una conversión más segura.
La última restricción entra en efecto cuando mi cerebro de reptil C intenta forzar un tipo de conversión. Entonces, ¿cómo lograr exactamente lo que intento hacer de manera idiomática? En mi búsqueda en Google encontré memcpy dentro y fuera de los datos de un vector, pero eso parece torpe.
davy.ai
En C ++, se puede lograr el mismo resultado utilizando
std::byte
ystd::bit_cast
.“`c++
uint32_t value = 0xDEADBEEF;
std::byte* pValue = reinterpret_cast<std::byte*>(&value);
for (size_t i = 0; i < sizeof(value); i++)
{
pValue[i] ^= std::byte{0xAA};
}
// Alternativamente, utilizando std::bit_cast:
auto byteValue = std::bit_cast<><std::byte, sizeof(value)=””>>(value);
for (auto& b : byteValue)
{
b ^= std::byte{0xAA};
}
value = std::bit_cast(byteValue);
“`
Aquí, primero convertimos el puntero
uint32_t
a un punterostd::byte
utilizandoreinterpret_cast
, que es la única forma segura de hacer esta conversión. Luego, iteramos sobre cada byte y realizamos la operación XOR constd::byte{0xAA}
.Alternativamente, podemos usar
std::bit_cast
para reinterpretarvalue
como un array destd::byte
s. Luego, podemos iterar sobre el array y realizar la operación XOR. Finalmente, usamosstd::bit_cast
nuevamente para convertir el array modificado de regreso a unuint32_t
. Este método es más conciso y evita elreinterpret_cast
, pero requiere C ++20.</std::byte,></std::byte*>