题目
分析
试着唱了一下(bushi,发现歌词里的提示
- 简谱需要转为 ASCII 码
- 谱子里没有 8,且 8 与进制相关
根据第 2 点可猜测谱子为八进制。
对照 ASCII 码表,发现编码的范围在 0 到 127 之间,其中非控制功能的字符范围为 32 到 126,范围大小为 95。而 8 的 3 次方可将这个范围完全囊括,谱子里的数字共 63bit 正好整除,于是暂定分组大小为 3bit 一组。对分组后得到的字符由八进制转换为十进制,得到 21 个数字。
再看题目,要求的是“有意义语句通顺”的字符串,尝试将数字对照 ASCII 码转换为字符串,得到 flag 内容。
代码如下:
// 按每3位一个数划分
int nums[] = { 111,114,157,166,145,123,145,143,165,162,151,164,171,126,145,162,171,115,165,143,150 };
int numsSize = sizeof(nums) / sizeof(int);
// 八进制转十进制
char* OctToDec = (char*)malloc(numsSize);
memset(OctToDec, 0, numsSize);
for (int i = 0; i < numsSize; ++i) {
int p = 0;
while (nums[i]) {
OctToDec[i] += nums[i] % 10 * pow(8,p);
nums[i] /= 10;
++p;
}
}
for (int i = 0; i < numsSize; ++i) {
printf("%c", OctToDec[i]);
}
Flag
flag{ILoveSecurityVeryMuch}