我正在尝试从uint8_t数组中提取值。但我很难理解这些在内存中是如何表示的。
#include <cstdio>
#include <cstring>
#include <stdint.h>
int main(){
uint8_t tmp1[2];
uint16_t tmp2 = 511;//0x01 + 0xFF = 0x01FF
tmp1[0] = 255;//0xFF
tmp1[1] = 1;//0x01
fprintf(stderr,"memcmp = %d\n",memcmp(tmp1,&tmp2,2));
fprintf(stderr,"first elem in uint8 array = %u\n",(uint8_t) *(tmp1+0));
fprintf(stderr,"first elem in uint8 array = %u\n",(uint8_t) *(tmp1+1));
fprintf(stderr,"2xuint8_t as uint16_t = %u\n",(uint16_t) *tmp1);
return 0;
}因此,我有一个2元素长的数据类型为uint8_t的数组。我只有一个变量uint16_t。
0000 0001 1111 1111但是当我使用memcompare时,它看起来实际上被表示为
1111 1111 0000 0001 所以只有“在”每个字节中才使用低字节顺序?由于在tmp11中设置的单个位计为256,即使它在我的流中更“正确”。因此,每个字节(而不是位)的值是bigendian吗?我对此有点困惑。
另外,如果我想强制fprint,将我的2xuint8_t作为一个uint16_t打印出来,我该怎么做呢?下面的代码不起作用,它只打印第一个字节。
fprintf(stderr,"2x uint8_t as uint16_t = %u\n",(uint16_t) *tmp1);提前感谢
发布于 2011-10-25 03:31:43
不要把字节序理解为“在字节内”。可以把它看作是“字节排序”。(也就是说,实际的位排序并不重要,因为人类通常以大端字符顺序读取值。)如果它有助于想象小端机器上的位是颠倒的,那么您可以这样想象。(在这种情况下,您的示例应该看起来像1111 1111 1000 0000,但正如我所说的,人类通常不会读取这样的数字,即最重要的值是right...but,您可能会认为这就是计算机看待事物的方式,如果它能帮助您理解little-endian的话。)
在一台小型endian机器上,正如您所看到的那样,0xAABBCCDD在内存中将被视为0xDD 0xCC 0xBB 0xAA。在大端机器(比如PPC机器)上,您在内存中看到的排序与您写出32位字时看到的排序相同。
发布于 2011-10-25 03:00:46
你对你期望的东西的假设是倒退的。您的观察结果与小端表示法一致。要回答您的最后一个问题,它将如下所示:
fprintf(stderr,"2x uint8_t as uint16_t = %u\n",*(uint16_t*)tmp1);发布于 2011-10-25 03:11:35
首先,如果你想100%确定你的变量在内存中的存储顺序是正确的,你应该把它们放在一个结构中。
然后请注意,memcmp()将您提供的输入视为一个字节序列,因为它对您提供的数据的性质没有任何假设。例如,考虑以下代码:
#include <stdio.h>
#include <stdint.h>
int main(int argc, char** argv) {
int32_t a, b;
a = 1;
b = -1;
printf( "%i\n", memcmp( &a, &b, sizeof( int32_t ) ) );
}它在我的小端机器上输出-254,而不考虑a> b,这是因为它不知道内存实际是多少,所以它像uint8_t数组一样比较它们。
如果你真的想要可视化数据在你的机器上是如何表示的,你可以首先使用fwrite将一个结构写到文件中,然后用你最喜欢的十六进制编辑器打开它(根据我的经验,如果数据是X-bit Y-endian ingeter,wxHexEditor会很好地告诉你它是什么样子的)。以下是源代码:
#include <stdio.h>
#include <stdint.h>
typedef struct {
uint8_t tmp1[2];
uint16_t tmp2;
} mytmp;
int main(int argc, char** argv) {
mytmp tmp;
tmp.tmp1[0] = 255;
tmp.tmp1[1] = 1;
tmp.tmp2 = 511;
FILE* file = fopen( "struct-dump", "w" );
fwrite( &tmp, sizeof( mytmp ), 1, file );
fclose( file );
}至于将uint8_t数组视为uint16_t,您可能希望声明一个union或使用指针强制。
https://stackoverflow.com/questions/7880389
复制相似问题