Tag: 字节序

64位值的反转字节

我正在尝试为分配反转64位地址指针的字节并具有以下代码: char swapPtr(char x){ x = (x & 0x00000000FFFFFFFF) <> 32; x = (x & 0x0000FFFF0000FFFF) <> 16; x = (x & 0x00FF00FF00FF00FF) <> 8; return x; } 但是,它只是让一切都搞砸了。 但是,类似的function适用于64位长。 是否需要针对指针做一些不同的事情? 我正在进行函数调用的方式是一个问题吗? 对于指针: *(char*)loc = swapPtr(*(char*)loc); 很久了: *loc = swapLong(*loc);

C端转换:逐位转换

我有一个特殊的无符号长整数(32位),我需要逐位转换它的字节顺序 – 我的long表示几个所有的东西都一起变成一个二进制文件。 我该怎么做?

如何在Little Endian与Big Endian架构中存储数组值

我正在询问如何判断数组中的一个元素何时完成,另一个元素何时以endian体系结构开始。 我有2个数组,其中long的大小为8,char的大小为1 long x[2] = {0x012345,0xFEDC}; char c[12] = {‘a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’0′,’1′,’2′,’3′}; 我想知道如果我们考虑x从内存地址0x100开始并且c从内存地址0x200开始,这些值将如何存储在不同的Endian架构中。 我认为Big Endian地址是{01,23,45,FE,DC} ,其中集合的第一个元素是内存地址0x100 ,下一个是0x101 ,第三个是0x102 ,依此类推,因为它存储了值基于MSB是第一个。 但是,我不确定是否应该在表示内存中的数组的值之间有一个指示符,以表明它是一个不同的元素,如null char。 像{01, 23, 45,’\0′, FE, DC} 同样对于Little Endian Architecture我相信它会将它存储为{45,23,01,DC,FE} ,但我不确定是否应该有一些指示器来突出显示数组中的不同元素

是否htonl()改变了BIG ENDIAN机器上的字节顺序?

字面意思是关于htonl()的混淆。 在这么多链接中,我发现执行htonl的代码是: #define HTONL(n) (((((unsigned long)(n) & 0xFF)) << 24) | \ ((((unsigned long)(n) & 0xFF00)) <> 8) | \ ((((unsigned long)(n) & 0xFF000000)) >> 24)) 如果在两台机器上运行相同的代码,它将交换字节顺序。 示例:uint32_t a = 0x1; 在Little Endian: 地址值 100 1 101 0 102 0 103 0 在htonl之后(a) 地址值 100 0 101 0 102 0 103 1 ============================================ 在Big Endian机器上: […]

为什么endianess在一个字节内的位之间很重要?

以下是linux机器上库的IP结构 struct ip { #if __BYTE_ORDER == __LITTLE_ENDIAN unsigned int ip_hl:4; /* header length */ unsigned int ip_v:4; /* version */ #endif #if __BYTE_ORDER == __BIG_ENDIAN unsigned int ip_v:4; /* version */ unsigned int ip_hl:4; /* header length */ #endif u_int8_t ip_tos; /* type of service */ u_short ip_len; /* total length */ u_short ip_id; […]

如何根据“Endianness”将数据存储在位级别?

我读到关于Endianness并理解蹲下…… 所以我写了这个 main() { int k = 0xA5B9BF9F; BYTE *b = (BYTE*)&k; //value at *b is 9f b++; //value at *b is BF b++; //value at *b is B9 b++; //value at *b is A5 } k等于A5 B9 BF 9F 和(字节)指针“ walk ”o / p是9F BF b9 A5 所以我得到它的字节向后存储……好吧。 〜 所以现在我想它是如何存储在BIT级别的…… 我的意思是“9f”(1001 1111)存储为“f9”(1111 1001)? 所以我写了这个 […]

在位域结构上转换Endianess

我需要将位域结构从little-endian转换为big-endia架构。 这样做的最佳方法是什么,因为如果我只是交换结构元素,那么字节边界就会出现问题。 Ex结构是: struct { unsigned int b1:1; unsigned int b2:8; unsigned int b3:7; unsigned int b4:8; unsigned int b5:7; unsigned int b6:1; };

Little endian与Big endian

假设我有4Byte整数,我想将它转换为2Byte短整数。 我是对的,在(小端和大端)短整数将包含这个4Byte整数的2个最低有效字节? 第二个问题: 小端和大端处理器中这些代码的结果是什么? int i = some_number; short s = *(short*)&i; 在大端处理器2中的恕我直言,将复制最重要的字节,在小端,将复制2个最低有效字节。

fread / fwrite大小和计数

我怀疑用于fread / fwrite的参数大小和计数的顺序。 如果我想从文件fp中读取8kb数据,以下哪项更有效? fread(data,1,8192,fp) fread(data,8192,1,fp) 还有我应该担心的endiannes问题吗?

Endian表示64位值

假设我unsigned long long x = 0x0123456789ABCDEF 。 以下哪项是正确的? (我只能validation第一个): 在32位小端处理器上,它将在内存中显示为67 45 23 01 EF CD AB 89 。 在64位小端处理器上,它将作为EF CD AB 89 67 45 23 01出现在内存中。 在32位大端处理器上,它将在内存中显示为01 23 45 67 89 AB CD EF 。 在64位大端处理器上,它将在内存中显示为01 23 45 67 89 AB CD EF 。