前几个月,经理说我们部门最近要招几个人,要我出几道面试题,题目的要求是,要考察C#基础,不要太难,不要出问答题,最好是有唯一答案的。因为这份面试题是给人事部的,他们可不懂程序。最后一个要求是,要有一两道题能区分中级程序员与初级程序员。
以前一直都是别人出题考我,现在终于有机会出题考别人,我心里那个激动哇,我就琢磨着出什么题目呢?在网上百度,Google了好一阵。好不容易,想出了10道题,让经理看了一眼。经理的回复是太难了,没有必要弄那么难,题目也太多,出个5道题就差不多了。看看,我们经理多好呀。又过了好一阵子,弄了5道题目。经理在最后还补充了一题。
今日,把题目翻了出来,选择了其中一道题目,在群里发了,看看群里的同志能不能做出来。结果让我,大吃一惊。没有一个人能够立马看懂题目的。同志们都开始怀疑我的语文水平,怀疑我的表达能力。虽然我的语文不怎么好,可也不至于导致这样的结果吧。我那个着急呀,我不断的解释题目,甚至我还写了程序表达题目的意思。最终让我还是大失所望没有人能过做出来。不过山东-查无此人,北京-悟,在我解释后,还是明白,而且山东给出了做法。下面我把题目贴出来,看看你会还是不会?
题目如下:
1:已经定义好的一个Byte数组,Byte数组的信息格式见下面的表格:
起始字节 | 字段 | 数据类型 | 描述 |
0 | 类型编号 | BYTE | 类型编号,占用1个字节 |
1 | 信息内容 | 信息内容,内容的格式详见下表 |
内容格式:
类型编号 | 类型说明 | 数据类型 | 描述 |
1 | 司机信息 | STRING | 前两字节表示字符串长度,后面紧跟UNICODE编码字符串,占用N个字节 |
2 | 油量 | DWORD | 单位:1/100L,无符号32位整数,占用四个字节。DWORD高位在前,低位在后。 |
…… | …… | …… | …… |
请编写一段程序,从Byte数组中解析出司机信息,油量信息。注意信息类型以后还会一直增加的。
上面这题是我出的题目的唯一一道编程题。主要目的也是用来区分中级程序员与初级程序员的。也是我工作中实际遇到的。
顺便说一下,我们的群欢迎大家来交流,来提问,更加欢迎您来分享你的知识。技术是在分享中不断进步的。非常感谢群中广州-某鱼今天给我的帮助!新加入群的朋友,请说明是博客园看到的,谢谢了。
已经过去一天了,下面给出司机信息的解析代码:
class Program { static void Main(string[] args) { byte[] array = GetDriverInfo(); if (array == null || array.Length == 0) return; byte type = 0; int arrayLen = array.Length; int index = 0; while (arrayLen > 0) { type = array[index]; switch (type) { case 1: ushort stringlen = (ushort)((array[index + 1] << 8) | (array[index + 2]) << 1); string driverInfo = Encoding.Unicode.GetString(array, index + 3, stringlen); index += stringlen + 3; arrayLen -= stringlen + 3; Console.WriteLine("司机信息:{0}", driverInfo); break; default: break; } } Console.ReadLine(); } private static byte[] GetDriverInfo() { string info = "1234567890:jerry"; //内容长度 int len = info.Length; byte[] array = new byte[len * 2 + 3]; array[0] = 1; //字符长度,高位在前 array[1] = (byte)((len >> 8)); array[2] = (byte)(len); //Unicode编码字符串 byte[] temp = System.Text.Encoding.Unicode.GetBytes(info); Array.Copy(temp, 0, array, 3, temp.Length); return array; } }