mirror of
https://bitbucket.org/Mattrixwv/cipherstream.git
synced 2025-12-06 18:33:58 -05:00
183 lines
4.0 KiB
C++
183 lines
4.0 KiB
C++
//Ciphers/SourceFiles/Caesar.hpp
|
|
//Matthew Ellison
|
|
// Created: 4-25-18
|
|
//Modified: 5-5-18
|
|
//This file contains the implementation of the Caesar class
|
|
//This class implements the Caesar Cipher and is inteded to be turned into a library
|
|
|
|
|
|
#include "../Headers/Caesar.hpp"
|
|
#include <string>
|
|
#include <cctype>
|
|
|
|
|
|
/**
|
|
* @brief Construct a new Caesar:: Caesar object
|
|
*
|
|
*/
|
|
Caesar::Caesar(){
|
|
reset();
|
|
}
|
|
|
|
/**
|
|
* @brief Destroy the Caesar:: Caesar object
|
|
*
|
|
*/
|
|
Caesar::~Caesar(){
|
|
}
|
|
|
|
/**
|
|
* @brief Sets the current inputString
|
|
*
|
|
* @param input The string that you wish to encode
|
|
*/
|
|
void Caesar::setInputString(std::string input){
|
|
inputString = input;
|
|
}
|
|
|
|
/**
|
|
* @brief Returns the current inputString
|
|
*
|
|
* @return The message that was just encoded/decoded
|
|
*/
|
|
std::string Caesar::getInputString() const{
|
|
return inputString;
|
|
}
|
|
|
|
/**
|
|
* @brief Set shift to a valid integer
|
|
*
|
|
* @param shiftAmount The number of letters the cipher needs to be shifted
|
|
*/
|
|
void Caesar::setShift(int shiftAmount){
|
|
//If you shift more than 26 you will just be wrapping back around again
|
|
shift = shiftAmount % 26;
|
|
}
|
|
|
|
/**
|
|
* @brief Returns the current number of letters the cipher is set to shift
|
|
*
|
|
* @return The current number of letters the cipher is currently set to shift
|
|
*/
|
|
int Caesar::getShift() const{
|
|
return shift;
|
|
}
|
|
|
|
/**
|
|
* @brief Returns the last message encoded/decoded
|
|
*
|
|
* @return The messge that was just encoded/decoded
|
|
*/
|
|
std::string Caesar::getOutputString() const{
|
|
return outputString;
|
|
}
|
|
|
|
/**
|
|
* @brief Encodes a message using the Caesar cipher
|
|
*
|
|
* @return The encoded message (outputString)
|
|
*/
|
|
std::string Caesar::encode(){
|
|
char temp; //A temperary holder for the current working character
|
|
for(unsigned int cnt = 0;cnt < inputString.size();++cnt){
|
|
temp = inputString.at(cnt);
|
|
//If it is a upper case letter shift it and wrap if necessary
|
|
if(isupper(temp)){
|
|
temp += shift;
|
|
//Wrap around if the letter is now out of bounds
|
|
if(temp < 'A'){
|
|
temp += 26;
|
|
}
|
|
else if(temp > 'Z'){
|
|
temp -= 26;
|
|
}
|
|
}
|
|
//If it is a lower case letter shift it and wrap if necessary
|
|
else if(islower(temp)){
|
|
temp += shift;
|
|
//Wrap around if the letter is now out of bounds
|
|
if(temp < 'a'){
|
|
temp += 26;
|
|
}
|
|
else if(temp > 'z'){
|
|
temp -= 26;
|
|
}
|
|
}
|
|
//If it is whitespace, number, or punctuation just let it pass through
|
|
//Add it to the output string
|
|
outputString += temp;
|
|
}
|
|
return outputString;
|
|
}
|
|
|
|
/**
|
|
* @brief Encodes a message using the Caesar cipher
|
|
*
|
|
* @param shiftAmount The number of letters you need to shift for the cipher
|
|
* @param input The message that needs encoded
|
|
* @return The encoded message
|
|
*/
|
|
std::string Caesar::encode(int shiftAmount, std::string input){
|
|
setShift(shiftAmount);
|
|
setInputString(input);
|
|
return encode();
|
|
}
|
|
|
|
/**
|
|
* @brief Decodes a message using the Caesar cipher
|
|
*
|
|
* @return The decoded message (outputString)
|
|
*/
|
|
std::string Caesar::decode(){
|
|
char temp;
|
|
for(unsigned int cnt = 0;cnt < inputString.size();++cnt){
|
|
temp = inputString.at(cnt);
|
|
//If it is an upper case letter shift it and wrap if necessary
|
|
if(isupper(temp)){
|
|
temp -= shift;
|
|
if(temp < 'A'){
|
|
temp += 26;
|
|
}
|
|
else if(temp > 'Z'){
|
|
temp -= 26;
|
|
}
|
|
}
|
|
//If it is a lower case letter shift it and wrap if necessary
|
|
else if(islower(temp)){
|
|
temp -= shift;
|
|
if(temp < 'a'){
|
|
temp += 26;
|
|
}
|
|
else if(temp > 'z'){
|
|
temp -= 26;
|
|
}
|
|
}
|
|
//If it is whitespace, number, or punctuation just let it pass through
|
|
//Add it to the output string
|
|
outputString += temp;
|
|
}
|
|
return outputString;
|
|
}
|
|
|
|
/**
|
|
* @brief Decodes a message using the Caesar cipher
|
|
*
|
|
* @param shiftAmount The number of letters you need to shift for the cipher
|
|
* @param input The message that needs decoded
|
|
* @return The decoded message
|
|
*/
|
|
std::string Caesar::decode(int shiftAmount, std::string input){
|
|
setShift(shiftAmount);
|
|
setInputString(input);
|
|
return decode();
|
|
}
|
|
|
|
/**
|
|
* @brief Makes sure all of the variables are blank
|
|
*
|
|
*/
|
|
void Caesar::reset(){
|
|
inputString = outputString = "";
|
|
shift = 0;
|
|
}
|