gpt4 book ai didi

c - 将base64编码器C源代码转换为bash内置脚本

转载 作者:行者123 更新时间:2023-11-30 16:30:37 24 4
gpt4 key购买 nike

Good day Stack,您可能会认为这与之前关于旧的 base64xxdhexdump 组合的问题已得到解答。将字符串转换为 Base64 的命令,但我不使用外部命令,而是尝试仅使用 bash 中的内置命令(例如 printfreadecho)来执行相同操作...我正在从 here 翻译 C 源代码,到目前为止我的编码工作正常,但我偶然发现了一个有问题的 C 行

char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
...
char *p;
...
p = strchr(b64, c);
...
in[phase] = p - b64; //Problematic line

问题是 pb64 是 char 数组,我不明白如何使用两个 char 数组进行算术表达式来获取数字,它可以类似于 not 或 xor O_o。我还在学习 C,了解的还不是很多。

这是我到目前为止所拥有的:

#!/bin/bash

declare -r b64=( {A..Z} {a..z} {0..9} {+,/} )

function ord() {
for i in {0..3}; do
printf '%d ' "'${1:$i:1}"
done
}

#TODO
function decodeblock() {
local out in=( $(ord $1) )
out[0]=$(( ${in[0]} << 2 | ${in[1]} >> 4 ))
out[1]=$(( ${in[1]} << 4 | ${in[2]} >> 2 ))
out[2]=$(( ${in[2]} << 6 | ${in[3]} >> 0 ))
printf "%s" "${out[@]}"
}

function encodeblock() {
local in=( $(ord "$1") ) len=$2 out index
index=$(( ${in[0]} >> 2 ))
out[0]=${b64[$index]}
index=$(( ((${in[0]} & 0x03) << 4) | ((${in[1]} & 0xf0) >> 4) ))
out[1]=${b64[$index]}
index=$(( ((${in[1]} & 0x0f) << 2) | ((${in[2]} & 0xc0) >> 6) ))
out[2]=$( (($len > 1)) && echo -n ${b64[$index]} || echo -n '=' )
index=$(( ${in[2]} & 0x3f ))
out[3]=$( (($len > 2)) && echo -n ${b64[$index]} || echo -n '=' )
printf "%s" "${out[@]}"
}

function b64_decode() {
local c i=0 phase=0 block p b64src="$1"
for (( i = 0 ; i < ${#b64src} ; i++)); do
c="${b64src:$i:1}"
[[ "$c" == '=' ]] && decodeblock "$b64src" && break
p="$c${b64[@]##*$c}"
if [[ -n "$p" ]]; then
#TODO
b64src[$phase]=
phase=$(( ($phase + 1) % 4 ))
if [[ $phase -eq 0 ]]; then
decodeblock "$b64src"
b64src=''
fi
((i++))
fi
done
}

function b64_encode() {
local block j=0 len clrstr="$1"
while [[ -n "${clrstr:$j:1}" ]]; do
len=0
for (( i = 0 ; i < 3 ; i++ )); do
block+="${clrstr:$j:1}"
[[ -n "${clrstr:$j:1}" ]] && { ((len++)) ; ((j++)); }
done
[[ -n $len ]] && encodeblock "${block[@]}" $len
block='' ; len=0
done
}

echo -n 'hello world' | base64 #DEBUG
b64_encode 'hello world' #DEBUG

b64_decode "$( b64_encode 'hello world' )"

问候和感谢。

最佳答案

strchr(b64, c) 在字符串 b64 中搜索字符 c,如果找到则返回指向它的指针;从此值中减去 b64 即可得出 b64 内字符的索引。

长话短说,它正在获取 b64 中的 c 索引。至于如何在shell中实现,here你可能会找到一些灵感。

关于c - 将base64编码器C源代码转换为bash内置脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51014655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com