Skip to content

Commit

Permalink
🗓 Dec 19, 2023 8:19:47 PM
Browse files Browse the repository at this point in the history
🤖 types added/updated
🐙 improve automatic delimiter detector
🎨 minor changes
  • Loading branch information
securisec committed Dec 20, 2023
1 parent 7717dcc commit f5df0c7
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 15 deletions.
26 changes: 17 additions & 9 deletions chepy/modules/dataformat.py
Original file line number Diff line number Diff line change
Expand Up @@ -568,10 +568,14 @@ def from_hex(self, delimiter: str = None, join_by: str = " ") -> DataFormatT:
b"AAA"
"""
data = self._convert_to_bytes()
delimiter = detect_delimiter(data, default_delimiter=None)
if delimiter is None:
delimiter = detect_delimiter(data, default_delimiter=None)
if delimiter is not None:
self.state = join_by.encode().join(
list(binascii.unhexlify(x) for x in data.split(delimiter))
list(
binascii.unhexlify(x)
for x in data.split(self._str_to_bytes(delimiter))
)
)
else:
self.state = binascii.unhexlify(data)
Expand Down Expand Up @@ -885,7 +889,9 @@ def from_charcode(
"""
data = self._convert_to_str()
out = []
delimiter = detect_delimiter(data)
if not delimiter:
delimiter = detect_delimiter(data)
print("🟢 ", delimiter)
for c in data.split(delimiter):
out.append(chr(int(c, base)))
self.state = join_by.join(out)
Expand Down Expand Up @@ -926,7 +932,8 @@ def from_decimal(self, delimiter: str = None, join_by: str = "") -> DataFormatT:
"ㅎ"
"""
data = self._convert_to_str()
delimiter = detect_delimiter(data)
if not delimiter:
delimiter = detect_delimiter(data)
self.state = join_by.join(
list(chr(int(s)) for s in data.strip().split(delimiter))
)
Expand Down Expand Up @@ -973,7 +980,8 @@ def from_binary(self, delimiter: str = None, byte_length: int = 8) -> DataFormat
"abc"
"""
data = self._convert_to_str()
delimiter = detect_delimiter(data)
if not delimiter:
delimiter = detect_delimiter(data)
n = int(
"".join([x[byte_length - 8 :] for x in data.split(delimiter)]),
2,
Expand Down Expand Up @@ -1016,7 +1024,8 @@ def from_octal(self, delimiter: str = None, join_by: str = "") -> DataFormatT:
"ab"
"""
data = self._convert_to_str()
delimiter = detect_delimiter(data, default_delimiter=delimiter)
if not delimiter:
delimiter = detect_delimiter(data, default_delimiter=delimiter)
self.state = join_by.join(
list(chr(int(str(x), 8)) for x in data.split(delimiter))
)
Expand Down Expand Up @@ -1372,7 +1381,7 @@ def substitute(self, x: str, y: str) -> DataFormatT:
return self

@ChepyDecorators.call_stack
def remove_nonprintable(self, replace_with: bytes = b"") -> DataFormatT:
def remove_nonprintable(self, replace_with: Union[str, bytes] = b"") -> DataFormatT:
"""Remove non-printable characters from string.
Args:
Expand All @@ -1381,8 +1390,7 @@ def remove_nonprintable(self, replace_with: bytes = b"") -> DataFormatT:
Returns:
Chepy: The Chepy object.
"""
if isinstance(replace_with, str):
replace_with = replace_with.encode()
replace_with = self._str_to_bytes(replace_with)
data = self._convert_to_bytes()
self.state = re.sub(b"[^[:print:]]", replace_with, data)
return self
Expand Down
4 changes: 2 additions & 2 deletions chepy/modules/dataformat.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,11 @@ class DataFormat(ChepyCore):
def swap_strings(self: DataFormatT, by:int) -> DataFormatT: ...
def to_string(self: DataFormatT) -> DataFormatT: ...
def stringify(self: DataFormatT, compact:bool=...) -> DataFormatT: ...
def select(self: DataFormatT, start: int, end: int) -> DataFormatT: ...
def select(self: DataFormatT, start: int, end: int=None) -> DataFormatT: ...
def length(self: DataFormatT) -> DataFormatT: ...
def to_leetcode(self: DataFormatT, replace_space: str=...) -> DataFormatT: ...
def substitute(self: DataFormatT, x: str=..., y: str=...) -> DataFormatT: ...
def remove_nonprintable(self: DataFormatT, replace_with: bytes = ...): ...
def remove_nonprintable(self: DataFormatT, replace_with: Union[str, bytes] = ...): ...
def to_base91(self: DataFormatT) -> DataFormatT: ...
def from_base91(self: DataFormatT) -> DataFormatT: ...
def swap_endianness(self: DataFormatT, word_length: int=...) -> DataFormatT: ...
Expand Down
4 changes: 2 additions & 2 deletions chepy/modules/encryptionencoding.py
Original file line number Diff line number Diff line change
Expand Up @@ -1505,7 +1505,7 @@ def to_letter_number_code(

@ChepyDecorators.call_stack
def from_letter_number_code(
self, delimiter: Union[str, bytes] = None, join_by: Union[str, bytes] = ""
self, delimiter: Union[str, bytes] = ' ', join_by: Union[str, bytes] = ""
) -> EncryptionEncodingT:
"""Decode A1Z26
Expand All @@ -1517,7 +1517,7 @@ def from_letter_number_code(
Chepy: The Chepy object.
"""
data = self._convert_to_str()
delimiter = detect_delimiter(data)
delimiter = detect_delimiter(data, default_delimiter=delimiter)
data = data.split(delimiter)
hold = ["§" for _ in range(len(data))]
for d in data:
Expand Down
12 changes: 10 additions & 2 deletions chepy/modules/internal/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,19 +137,24 @@ def set(self, index, value):
def detect_delimiter(
data: Union[str, bytes],
delimiters: List[Union[str, bytes]] = [
" ",
"; ",
";",
". ",
".",
"- ",
"-",
"\\",
": ",
":",
"/",
", ",
",",
" ",
"\n",
"\\x",
"\\0x",
],
default_delimiter: str = " ",
default_delimiter: str = "",
) -> Union[str, bytes, None]:
"""Detect delimiter
Expand All @@ -161,6 +166,9 @@ def detect_delimiter(
Returns:
Union[str, bytes, None]: Delimiter or None if one is not found
"""
if default_delimiter:
return default_delimiter

is_bytes = False
if isinstance(data, bytes): # pragma: no cover
delimiters = [d.encode() for d in delimiters]
Expand Down

0 comments on commit f5df0c7

Please sign in to comment.