es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    En C ++, se puede lograr el mismo resultado utilizando std::byte y std::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 puntero std::byte utilizando reinterpret_cast, que es la única forma segura de hacer esta conversión. Luego, iteramos sobre cada byte y realizamos la operación XOR con std::byte{0xAA}.

    Alternativamente, podemos usar std::bit_cast para reinterpretar value como un array de std::bytes. Luego, podemos iterar sobre el array y realizar la operación XOR. Finalmente, usamos std::bit_cast nuevamente para convertir el array modificado de regreso a un uint32_t. Este método es más conciso y evita el reinterpret_cast, pero requiere C ++20.</std::byte,></std::byte*>

Comments are closed.