百科问答小站 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); }      


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




  

相关话题

  C++里 const int* 与 int const* 有什么区别? 
  在校生为了面试,有必要强行记住一些复杂算法如红黑树、KMP等的实现吗? 
  Tiny C Compiler是个怎样的编译器?有人更新吗? 
  Java对于int变量a,如何以最快速度计算34*a? 
  土豪程序员的生活是怎样的? 
  Java 位与0xff 和位或0x00 得到的结果为什么不同? 
  C#的Lambda表达式捕获变量疑问? 
  如何评价网飞(Netflix)出品的剧集《松树谷》(Pine Gap)? 
  大二学生,计算机科学与技术专业,学到数据结构和组原有点心态爆炸了,看不懂敲不出代码,还有救吗 ? 
  有哪些看似简单其实非常精妙的代码? 

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





© 2025-05-05 - tinynew.org. All Rights Reserved.
© 2025-05-05 - tinynew.org. 保留所有权利