About neohope

一直在努力,还没想过要放弃...

c与cpp输出16进制,8进制及ASCII

1.c

#include <stdio.h>
int main(int argc,char **argv)
{
	for(int i=0;i<=127;i++)
	{
		printf("%X-%03o-%c\n",i,i,i);
	}
	return 0;
}

2.cpp

#include <iostream>
#include <iomanip>

using namespace std;

int main(int argc,char **argv)
{
	for(int i=0;i<=127;i++)
	{
		cout<<setw(2)<<setfill('0')<<hex<<i<<"-"<<setw(3)<<setfill('0')<<oct<<i<<"-"<<dec<<(char)i<<endl;
	}

	return 0;
}

obj还是objs?

运行下面代码,得到的结果是什么?
obj还是objs?

public class Test{
       public static void test(Object obj){
              System.out.println("obj");
       }
       public static void test(Object[] objs){
              System.out.println("objs");
       }
       public static void main(String[] args){
              test(null);
       }
}

是objs哦:)

1和0

下面语句会出错吗?
你感觉哪一句不会出错呢?

public class Test01
{
    public static void main(String[] atgs)
    {
        System.out.println(1.0/0.0);
        System.out.println(1.0/0);
        System.out.println(1/0.0);
        System.out.println(1/0);
        System.out.println(0/0);
    }
}

你对java中的无穷大和非数了解吗?

如何将JVM弄崩溃

什么是JVM的崩溃呢?
JVM已经无法抛出异常了,你会看到这样的错误

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_STACK_OVERFLOW (0xc00000fd) at pc=0x6d8a99c6, pid=2572, tid=964
#
# JRE version: 6.0_22-b04
# Java VM: Java HotSpot(TM) Client VM (17.1-b03 mixed mode, sharing windows-x86
)
# Problematic frame:
# V  [jvm.dll+0x99c6]
#
# An error report file with more information is saved as:
# D:\E\Projects\Java\Crash\hs_err_pid2572.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

同时会生成hs_err_pidxxxx.log的日志文件。

怎么把JVM弄崩溃呢?
总结了一下,感觉有三种方法
1是利用编译器及JVM自身特性,导致不可恢复的灾难;
2是利用JDK或JVM的bug;
3是用JNI,让JVM鞭长莫及,无论是sun提供的,还是我们自己写的;

import sun.dc.pr.PathDasher; 
import sun.misc.Unsafe;

//方法1
//我最认可的方法
public static void main(String[] args) {
    Object[] o = null;
    while (true) {
        o = new Object[] { o };
    }
}

//方法2
//JDK1.6u23 以前版本中的bug
public static void main(String[] args) {
    Double.parseDouble("2.2250738585072012e-308");
}

//方法3
//JNI
public static void main(String[] args)
{    
    PathDasher dasher = new PathDasher(null) ;
}

//方法4
//JNI
//java -Xbootclasspath/p:. Crash
private static final Unsafe unsafe = Unsafe.getUnsafe();
public static void crash()
{
    unsafe.putAddress(0, 0);
}

public static void main(String[] args) {
    crash();
}

VC判断UTF-8与ANSI

大家知道,如果只有英文的话,UTF-8与ANSI是一样的
但有了中文以后,情况就很不一样了,
在ANSI中,比如GBK,中文占两字节,
在UTF-8中,中文占三字节,
当中英文混合时,情况就更复杂一些了。
下面一段是在以前项目中,先判断是UTF-8还是GBK然后转为UNICODE的代码

//要判断内容
char *s1="....";
//字符编码
UINT CodePage=0;
//字符串长度
int nLen=strlen(s1);

//判断是否为UTF-8
//至少要3字节
if(nLen>=3)
{
    unsigned char U1,U2,U3;
    int nNow=0;
    while(nNow<nLen)
    {
        U1=(unsigned)s1&#91;nNow&#93;;
        if((U1&0x80)==0x80)
        {
            //中文字符,则要三个字符
            if(nLen>nNow+2)
            {
                U2=(unsigned)s1[nNow+1];
                U3=(unsigned)s1[nNow+2];
                //中文三字节为0xE0 0xC0 0xC0
                if(((U1&0xE0)==0XE0) && ((U2&0xC0)==0x80) && ((U3&0xC0)==0x80))
                {
                    //有可能是UTF-8
                    CodePage=65001;
                    nNow=nNow+3;
                }
                else
                {
                    //不是UTF-8
                    CodePage=0;
                    break;
                }
            }
            else
            {
                //不是UTF-8
                CodePage=0;
                break;
            }
        }
        else
        {
            //非中文字符
            nNow++;
        }
    }
}

DWORD dwNum;
dwNum=MultiByteToWideChar(CodePage,0,s1,-1,NULL,0);
if(dwNum)
{
    wchar_t *pwText;
    pwText=new TCHAR[dwNum];
    if(pwText)
    {
        MultiByteToWideChar(CodePage,0,s1,-1,pwText,dwNum);
    }
    szPatientName=pwText;
    delete []pwText;
}

cpp中删除一个静态局部变量?

大家都知道,static变量,内容在堆中分配的,new来的对象也是堆中分配的,
那么,如果在cpp中删除一个静态局部变量,后果是什么?
编译错误?还是运行错误?
比如下面的aTest函数,能运行吗?

#include <iostream>
using namespace std;

int aTest()
{
	static int a=0;
	int *b=&a;
	delete b;
	return a++;
}

int main(int argc,char** argv)
{
	for(int i=0;i<100;i++)
	{
		cout<<aTest()<<endl;
	}
	return 0;
}

事实是,
在gcc下,无论debug还是release,都没有问题,
在vc下,debug会报assert错误,release没有问题。
那cpp下,内存管理是谁做的?编译器为什么让它过去了呢?
其实,个人感觉,也就是上面的内存操作并不多,复杂情况下,早就挂了。

c语言中,用函数实现sizeof操作

大家都知道,c语言中sizeof是个操作符,在编译阶段已经变成了数值
要用函数实现sizeof的话,和sizeof操作符是会有一定区别的
这里,我只给出了一个很简单的例子,
用指针操作实现sizeof(double)的功能

double a=0.0;
int sz=(int)&((&a)[1])-(int)&a;

汉化.net程序

1.首先是反编译

ildasm11.exe /ALL /VISIBILITY=PUB+PRI+FAM+ASM+FAA+FOA+PSC /UNICODE Target.dll /OUT=Target.il

2.打开Target.il
搜索ldstr,后面就是你所需要汉化的字符串

同时会遇到bytearray类型的字符串,这些字符串是以UNICODE的HEX方式存储的,将汉化后内容,同样转成UNICODE的HEX字符串存回去,同时记住要修改字体

3.去掉StrongName
将Target.il中publickkey字段删除

4.生成snk

sn.exe -k Target.snk

5.重新编译并增加StrongName

ILASM11.exe Target.il /dll /key:Target.snk /resource:Target.res /out:Target_cn.dll

6.验证

sn -v Target_cn.dll

第一次汉化游戏

上大学时,有款游戏叫“是男人就下100层”
无聊的时候玩玩还不错

但是看到上面的日文,我就不爽,干脆,汉化掉算了
查看后,没加壳,哈哈哈哈哈哈哈哈
掏出eXeScope,找出资源,我改。。。
很快菜单等资源都改好了

运行试试,感觉不错,但旁边怎么还有这么大的日文?
继续找,发现,居然是图片
算你狠,掏出PS,改了几张,换上去
啊~~~
好难看,字体好难看啊
我这个没审美观的人都觉得好难看啊

算了,这个汉化版就算了吧,还是不拿出去丢人了。

过了几个月,
一哥们跟我说,来,我有中文版,
我很想看看PS高人怎么换掉图片的,
结果,
结果,他只换了菜单,
还没我汉化的多。。。
心情大好,原来我不是最差的那个啦

其实,换掉菜单后,的确就容易入手一些了,
后来看到过比较好的版本,但加壳了,
也没空细细研究,高手还是普遍存在的