面试被鄙视了。面试题共享

duruos 2014-11-07 06:23:28
一直都在windows下做c++的,平时也就改改代码。感觉老没意思。就刷新了下简历投了份linux c的工作,通知今天去面面。没准备,请了一天假直接跑去了。到了给1张纸两道题20分钟写完。看了题傻眼了最后被狠狠的鄙视了。把题发下大家共同学习。题目靠记忆描述个大概。
1.把数字存入缓冲区buffer用于网络传输且与机器无关。实现二进制版本和文本版本读取读写。
int readInt(int data,char*buffer)
int writeInt(int data,char*buffer)
int readIntText(int data,char*buffer)
int writeIntText(int data,char*buffer)

2.实现两个字节字符串(unicode)与一个字节字符串(Ascii)互相转换。


第一题,没用过,我实现思路是二进制形式,写时候按位与(&)取最低字节存入buffer右移8位(>>8)直到整个整数都存入,读取时移位相加。文本形式实现方法相似,多了向ACSII码转换。
第二题 从来没想过自己实现。
...全文
184 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑娃 2014-11-08
  • 打赏
  • 举报
回复
第一题转2进制我认为是一个int就用4个字节,把它的二进制copy过去就是了,不过要注意区分字节序,可能要在前面增加一个字节来表示自己封装的字节序。 第二题,,,,需要转换吗?ascII的字符在所有编码下都是一样的。。。
taochao90 2014-11-08
  • 打赏
  • 举报
回复
20分钟好有压力
duruos 2014-11-08
  • 打赏
  • 举报
回复
引用 5 楼 ForestDB 的回复:
int readInt(int * data,char*buffer) *data = ntohl(*((int *)buffer)); int writeInt(int data,char*buffer) data = htonl(data); memcpy(buffer, &data, sizeof (int)); int readIntText(int * data,char*buffer) *data = atoi(buffer); int writeIntText(int data,char*buffer) sprintf(buffer, "%d", data); int版本的主要看大/小端,text版本的无所谓大小端。 第二题用iconv库。
一看到题就想自己动手,原来还可以这样简单
duruos 2014-11-08
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
引用
实现两个字节字符串(unicode)与一个字节字符串(Ascii)互相转换。
怀疑是ansi, 不是Ascii.
应该是的,当时一看题紧张了,后面记错了吧
ForestDB 2014-11-07
  • 打赏
  • 举报
回复
int readInt(int * data,char*buffer) *data = ntohl(*((int *)buffer)); int writeInt(int data,char*buffer) data = htonl(data); memcpy(buffer, &data, sizeof (int)); int readIntText(int * data,char*buffer) *data = atoi(buffer); int writeIntText(int data,char*buffer) sprintf(buffer, "%d", data); int版本的主要看大/小端,text版本的无所谓大小端。 第二题用iconv库。
碼上道 2014-11-07
  • 打赏
  • 举报
回复
不建议面试的时候测试 这样的,实际没有多大的意义。
mujiok2003 2014-11-07
  • 打赏
  • 举报
回复
引用
实现两个字节字符串(unicode)与一个字节字符串(Ascii)互相转换。
怀疑是ansi, 不是Ascii.
mujiok2003 2014-11-07
  • 打赏
  • 举报
回复
趁着有时间写了第一题

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

int readInt(int& data, char*buffer)
{
	int cnt = 0;
	while(*buffer){
		 ++cnt;
		 ++buffer;
	}
	int x = ++cnt;
	data = 0;
	for(--buffer,--cnt; cnt; --buffer, --cnt)
	{
		(unsigned int&)data <<= 8;
		(unsigned int&)data |= (unsigned char)*buffer;
	}
	return x;
}

int writeInt(int data,char*buffer)
{
   int cnt = 0;
   while(data){
   	 *buffer++ = (unsigned int&)data & 0xff;
   	(unsigned int&) data >>= 8;
   	 ++cnt;
   }
   *buffer = 0;
   return ++cnt;
}

int readIntText(int data,char*buffer)
{
	int cnt = 0;
	while(*buffer){
		 ++cnt;
		 ++buffer;
	}
	int x = ++cnt;
	data = 0;
	for(--buffer,--cnt; cnt; --buffer, --cnt)
	{
		(unsigned int&)data <<= 8;
		(unsigned int&)data |= *buffer - '0';
	}
	return x;
}
int writeIntText(int data,char*buffer)
{
   int cnt = 0;
   while(data){
   	 *buffer++ = (unsigned int&)data & 0xff - '0';
   	(unsigned int&) data >>= 8;
   	 ++cnt;
   }
   *buffer = 0;
   return ++cnt;
}

int main()
{
	char buf[128];
	srand((unsigned)time(0));
	int x = rand(), y = rand(), z = rand();
	printf("%x %x %x\n", x, y, z);
	int off = writeInt(x, buf);
    off += writeInt(y, buf+off);
    off += writeInt(z, buf+off);
	off = readInt(x, buf);
	off += readInt(y, buf + off);
	off += readInt(z, buf + off);
	printf("%x %x %x\n", x, y,z);
	
	off = writeIntText(x, buf);
    off += writeIntText(y, buf+off);
    off += writeIntText(z, buf+off);
	off = readIntText(x, buf);
	off += readIntText(y, buf + off);
	off += readIntText(z, buf + off);
	printf("%x %x %x\n", x, y,z);
	return 0;
}

JiangWenjie2014 2014-11-07
  • 打赏
  • 举报
回复
第一题显然考的是字节序问题,整数的传输是需要考虑字节序的,字符串的传输则不用考虑。写入时先转换为网络字节序,然后memcpy即可;读取时先memcpy,然后转换为本地字节序即可。 第二题,题目没看懂。

69,378

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧