月度归档:2016年03月

二进制文件跟普通文本文件的区别

作者: dplord, 访问量 1669





任何文件都可以划分为二进制文件(binary file)跟文本文件(text file), 两种文件表面上看起来显示,但是两种文件编码数据的方式却有差异。两种文件都是用一系列的字节编码数据,在文本文件中,所编码的字节就是代表文本文件的内容,而二进制文件的编码,却代表自定义的数据格式,需要特殊的去decode文件内容。下面就用『ab12\n3』为代表写入两种文件,读取看看差异。(\n 是换行符)

写程序如下:

#include <stdio.h>
#include <string.h>

int main() {
	FILE *fp = fopen("data.text", "w+");
	FILE *fp1 = fopen("data.bin", "wb+");
	
	
	if((fp == NULL) || (fp1 == NULL)) 
	{
		fprintf(stderr, "can not open file...");
		return -1;
	}
		
	const char *str = "ab12\n3";
	int len = strlen(str);
	fwrite(str, len, 1, fp);
		
	const char *str1 = "ab";
	int a = 12;
	const char *str2 = "\n";
	int b = 3;
	int len1 = strlen(str1);
	int len2 = strlen(str2);
	
	fwrite(str1, len1, 1, fp1);
	fwrite(&a, 1, 1, fp1);
	fwrite(str2, len2, 1, fp1);
	fwrite(&b, 1, 1, fp1);
	
	fclose(fp);
	fclose(fp1);
	return 0;
}

查看文件大小,  如下

➜  ~ ll -h data.text data.bin
-rw-r--r--  1 dengpan  staff     5B  3 14 01:38 data.bin
-rw-r--r--  1 dengpan  staff     6B  3 14 01:38 data.text
➜  ~ hexdump data.text
0000000 61 62 31 32 0a 33
0000006
➜  ~ hexdump data.bin
0000000 61 62 0c 0a 03
0000005

二进制文件data.bin是5bit, 文本文件data.text是6bit。其中文本文件data.text中的6个bit,分别对应a、b、1、2、\n、3。其中二进制文件data.bin里面的5个bit分别对应a、b、12、\n、3。

其中data.text就是其中的文本字符串的anscii吗,一个字符一个字符对应的。具体个参照ascii-table。文本编辑器打开data.text会换行,是因为碰到了换行符0a,编辑器会自动做换行处理的。

二进制文件的每一个bit放什么数据完全可以自己控制,可以放int、short、char等等,也可以放struct数据。当时解析二进制file的时候,需要知道解析规则,不然也不可读。以下是data.bin根据写的顺序写的读出来输出内容的解析代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	FILE *fp = fopen("data.bin", "rb+");
	if(fp == NULL) 
	{
		fprintf(stderr, "can not open file...");
		return -1;
	}
	
	int len_a = 2;
	char *a = malloc(len_a);
	int num1 = 0;
	int len_b = 1;
	char *b = malloc(len_b);
	int num2 = 0;
	
	fread(a, len_a, 1, fp);
	fread(&num1, 1, 1, fp);
	fread(b, len_b, 1, fp);
	fread(&num2, 1, 1, fp);

	printf("%s%d%s%d\n", a, num1, b, num2);
	fclose(fp);
	return 0;
}

其实文本文件本身就是一个特殊的binary file, 只不过是按照字符串内容,依次按字节写内容而已。二进制文件是按照自己的编码格式来的,常见的二进制文件比如图片、文档、视频,遵循一定的约定,通常是约定头部字节等于一些固定开头的值,各个文件约定也不尽相同,比如jpg的文件的头4个字节是固定的FF D8 FF E0 或者 FF D8 FF E1 或者 FF D8 FF E8, png的头8个字节是89 50 4E 47 0D 0A 1A 0A。用hexdump可以查看一个文件的hex内容。比如:

QQ20160314-1@2x

具体的查看每种文件的头部字节约定可以查看,File signatures网站

Mac下Virtualbox使用小结

作者: dplord, 访问量 2615





因为工作原因,使用Mac机器。但是以前一直用linux,熟悉上面的各种开发环境。Mac由于是Unix系列,挺多开发环境挺好的。但是还是蛮多库、项目、编译没有那么方便。自己在virtualbox下改了一个opensuse text mode虚拟机,并设置了share folders, 可以在mac下的IDE下编辑建立在mac跟virtualbox的linux虚拟机的share dir的项目,然后在terminal下进入linux虚拟机,命令行编译跟处理。这样可以一个机器,无缝使用多个环境。下面讲解下virtualbox的几个要设置的地方。

1、安装virtualbox以及准备几个需要用的文件

要下当前最新的同一版本、最新的软件。

我下载的为

  • VirtualBox-5.0.14-105127-OSX.dmg
  • Oracle_VM_VirtualBox_Extension_Pack-5.0.14-105127.vbox-extpack
  • VBoxGuestAdditions_5.0.14.iso

2、设置正确的网络链接方式

默认的网络连接方式是『网络地址转换(NAT)』, 我需要的是内部linux guest主机,需要既能连接外网,同时也可以在外部mac host机器上,ssh通过内网连接linux guest。默认网络如图

QQ20160310-0@2x内部网络如图

QQ20160310-1@2xip是nat出来的网址10.0.2.15, 跟我的mac host不在一个网段,无法ssh连接。

需要创建一个处于同一网段的网络,因此做了如下操作

① 在virtualbox偏好设置里面添加一个host-only网卡,名字为vboxnet0

② 给该linux host的第二网卡上,绑定刚创建的vboxnet0 的 host-only 网卡

③ 在linux-guest里面,ifconfig查看还是一个网卡,手动编辑

touch /etc/sysconfig/network/ifcfg-eth1

写入以下内容

BOOTPROTO='dhcp'
BROADCAST=''
ETHTOOL_OPTIONS=''
IPADDR=''
MTU=''
NAME=''
NETMASK=''
NETWORK=''
REMOTE_IPADDR=''
STARTMODE='auto'
DHCLIENT_SET_DEFAULT_ROUTE='yes'

然后reboot,查看后就可以看到有eth1的网卡了, ip是192.168.56.101,可以在mac host用ssh连接。因为这个网络是dhcp分配的ip的,为了方便把vboxnet0网络,dhcp ip地址段设置为一个固定ip, 如图:

QQ20160310-4@2x以后在mac host, 每次ssh dengpan@192.168.56.101, 即可连接该机器。可以在bashrc做一个alias。

3、设置共享文件夹

① 挂载VBoxGuestAdditions_5.0.14.iso 到linux guest

② mount /dev/cdrom /mnt

③ cd /mnt  && ./VBoxLinuxAdditions.run –nox11 (因为我的是opensuse text mode,没有图形界面的)

④ 在virtualbox的设置界面设置share dir并设置自动挂载, 然后reboot, 就可以再/media 看到你的文件夹了。

4、virtualbox的备份、恢复

virtualbox比较好用的一点是,可以备份整个硬盘,然后把几十G的「虚拟硬盘.vdi 」拷贝到移动硬盘留着,在任何系统安装完了virtualbox挂载该「虚拟硬盘.vdi 」即可开始使用了。后面可以开virtualbox-linux, 开始无缝使用自己要用的工具了。在MAC下的IDE编辑项目,ssh连接到linux shell下编译、处理,网络都是共享的。使用比较便捷,而且不卡,符合我的预期。