我遇到一个问题,即unsigned char
数组存储unsigned int
个,int
只使用3个字节。
为什么我的老师会像这样unsigned char s[]="\x12\x34\x78\x9A\xBC\xDE\xFF"
初始化矢量而不仅仅是使用整数?我相信这些数字用十六进制表示?
答案 0 :(得分:9)
因为你的老师可能会吝啬他的记忆力。
通过使用unsigned char
s的“压缩”数组,每个24位整数只能使用24位存储(假设是8位char
,这里不是很有争议我希望)。
请注意,选择使用字符串表示法也会使其在源代码中更加紧凑(尽管可读性较差);第一个整数是"\x12\x34\x78"
,数组表示法是0x12, 0x34, 0x78
,由于逗号(和空格,当然可以删除,不像逗号),因此更长。
可能的折衷方案是使用C相邻字符串文字连接的事实,并将每个24位数字写为自己的字符串:
unsigned char s[] = "\x12\34\x78" "\x9a\xbc\xde";
这样可以更容易地发现每个数字的边界,但当然重复的引号会占用空间。
你可以像这样提取一个整数:
unsigned int unpack24(size_t index)
{
if(index >= (sizeof s) / 3)
return 0;
const unsigned int hi = s[3 * index];
const unsigned int mid = s[3 * index + 1];
const unsigned int low = s[3 * index + 2];
return low | (mid << 8) | (hi << 16);
}
请注意,上面假设为big-endian数字,因此第一个将解包为0x123478
;我当然不知道这是对的。