百科问答小站 logo
百科问答小站 font logo



美剧《硅谷》第三季第一集神秘代码写的是什么? 第1页

  

user avatar   simonxia-OMG 网友的相关建议: 
      

试了一下,运行结果如红框所示,第一反应是HBO的编剧也是蛮拼的。。。

这是一段花式输出字符串的程序,源代码被黑科技玩坏了

原理其实很简单,我们注意到代码中有个特别的 magic number 是65,没错,那就是ASCII 表里的 A,前面那一堆不过是在叠加偏移量,以此来实现输出。

具体地说,偏移量的计算是用 0x1FULL 这个无符号长整型常量作为掩码(二进制表示为 11111),从低位开始每次从

       0x79481E6BBCC01223 + ((dcf_t)0x1222DC << 64)      

这个大整数中取出 5 位,所取出的 5 位二进制表示即为偏移量。

我们用同样的 trick 可以输出任意想要的字符串。比如:

       #include <stdio.h> #include <stdlib.h>  typedef unsigned long u64;  typedef void enc_cfg_t; typedef int enc_cfg2_t; typedef __int128_t dcf_t;  enc_cfg_t _ctx_iface(dcf_t s, enc_cfg2_t i){  int c = (((s & ((dcf_t)0x1FULL << i * 5)) >> i * 5) + 65);  printf("%c", c);}          enc_cfg2_t main() {  for (int i=0; i<10; i++){   _ctx_iface(0x28EC789572FC8 + ((dcf_t)0x000000 << 64), i);  } }      

将得到:



摸清了套路,我们也成了老司机,甚至可以写一段程序来生成这段看起来很黑科技的代码。

gen.c

       #include <stdio.h> #include <string.h>  #define MAX_LEN 25 // 128 的位整数最多用此方法可以存放25个字符  const char *text = "#include <stdio.h>
#include <stdlib.h>

typedef unsigned long u64;

typedef void enc_cfg_t;
typedef int enc_cfg2_t;
typedef __int128_t dcf_t;

enc_cfg_t _ctx_iface(dcf_t s, enc_cfg2_t i){
	int c = (((s & ((dcf_t)0x1FULL << i * 5)) >> i * 5) + 65);
	printf("%%c", c);}
	enc_cfg2_t main() {
	for (int i=0; i<%d; i++){
		 _ctx_iface(0x%llX + ((dcf_t)0x%X << 64), i);
	}
}
";   int main() {  char input[MAX_LEN];  memset(input, 0x00, sizeof(char)*MAX_LEN);  if (fgets(input, MAX_LEN, stdin) == NULL) {   printf("fail to read input
");   return -1;  }   unsigned long long mask1 = 0;  __int128_t mask2 = 0;  int i;  for (i = 0; input[i] != '
' && i < MAX_LEN; i++) {   if (i < 12) {    mask1 |= (unsigned long long)(((input[i] - 'A') & 0x1F)) << i*5;   } else if (i == 12) {    mask1 |= (unsigned long long)(((input[i] - 'A') & 0xF)) << i*5;    mask2 |= ((input[i] - 'A') & 0x10) >> 4;   }else{    mask2 |= (unsigned long long)(((input[i] - 'A') & 0x1F)) << (i-13)*5+1;   }  }  printf(text, i, mask1, mask2); }      


现在用这段程序,我们可以随意发挥了




  

相关话题

  如何减少代码中的if else或者找到代替的方式? 
  计算机专业大学生想要在以后有一份好工作,在大学期间应该及时考哪些证书? 
  c/c++怎么把一个bool数组(刚好8个元素)转换成char? 
  程序员的价值会随工作经验增多而增长么? 
  C++,全局变量如果用new了,需要delete吗? 
  为什么程序员要使用三元运算符而不是显式写出 if 语句? 
  Objective-C 的一些函数名为什么都这么长? 
  如何评价《生活大爆炸》(The Big Bang Theory)第十二季大结局? 
  如何看待阿里 P8 加面 coding 环节,而 P7 却做不出头条算法题? 
  PRML为何是机器学习的经典书籍中的经典? 

前一个讨论
能否推荐几个界面好看的个人网页设计?
下一个讨论
如何评价美剧《硅谷》?





© 2024-06-02 - tinynew.org. All Rights Reserved.
© 2024-06-02 - tinynew.org. 保留所有权利