jjzjj

endianness

全部标签

c++ - Little Endian - Big Endian 问题

小端与大端大字节序=0x31014950小字节序=0x50490131但是使用这个方法inlineunsignedintendian_swap(unsignedint&x){return(((x&0x000000FF)>8)|((x&0xFF000000)>>24));}结果=0x54110131我花了很多时间尝试很多类似的方法,甚至是像这样的库unsignedlong_byteswap_ulong(unsignedlongvalue);但仍然没有运气..所有返回相同的结果编辑我正在使用MicrosoftVisualStudio2008开发Little-Endian系统例子如下intm

c# - 位移位是否总是考虑 Endian 体系结构?

假设我正在从C++移植代码并需要在C#中模拟相同的位移技术:每当我执行位移时,我是否必须考虑架构的Endain-ness? 最佳答案 没有。位移是一种纯粹的代数运算。它不比乘以二更依赖于平台。平台相关的是将变量解释为字符数组的结果。 关于c#-位移位是否总是考虑Endian体系结构?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/15315425/

c++ - 结构中的位顺序不是我所期望的

我有一个使用16位float的框架,我想分离它的组件然后用于32位float。在我的第一种方法中,我使用了移位和类似的方法,虽然它有效,但阅读起来却非常困惑。然后我想改用自定义位大小的结构,并使用union来写入该结构。重现问题的代码:#include#includeunionfloat16_and_int16{struct{uint16_tMantissa:10;uint16_tExponent:5;uint16_tSign:1;}Components;uint16_tbitMask;};intmain(){uint16_tinput=0x153F;float16_and_int16

c++ - 字节顺序是在编译时决定的吗?

我现在想偷懒,写一些代码,如果目标机器的字节顺序与我自己的不同,这些代码就会中断。但是我当然想知道它什么时候坏了,所以我可以在必要时修复它。float和整数的字节顺序是否是已编译程序的一个属性,这样我就可以在编译时通过断言以某种方式检查它?还是我必须在运行时断言? 最佳答案 是的,字节序是相关机器固有的,并且在编译时已知。大多数操作系统都会在某处设置一个#define来告诉您字节序是什么。特别是在Linux上,您可以执行以下操作:#if__BYTE_ORDER==__LITTLE_ENDIAN...#elif__BYTE_ORDER

c++ - C++代码中的字节序影响

我知道这可能是个愚蠢的问题,但我是C++开发新手,我需要一些关于字节顺序的说明。我必须实现一个依赖SCTP协议(protocol)的通信接口(interface),以便在两台不同的机器(一台基于ARM,另一台基于Intel)之间进行通信。目的是:将消息编码为字节流以在套接字上发送(我使用了一个uint8_tvector,并定位了不同字段的每个字节——注意将uint16/32/64拆分为单个字节——遵循big-endian惯例)通过套接字将字节流发送到接收器(使用stcp)检索流并解析它,以便用正确的元素(由标题+电视信息元素表示)填充消息对象我对使用接口(interface)的两台机器

c++ - 为什么在将 short[] 转换为 char* 时数组会反转?

对于下面的代码:shortshortArray[]={('B'输出是:ABCDEFG有人可以向我解释一下这是如何工作的吗? 最佳答案 表达式('B'结果类型为int,将等于'B'*256+'A'.当转换为short时(假设short表示为两个8位字节)此值由字节对AB表示,其中A是最低有效字节。在小端机器上,最低有效字节最先出现在内存中(即'A'在最左边,下一个字节是'B')。在大端机器上,'B'将在最左边。您描述的输出表明您的主机架构是小端架构。英特尔处理器都是小端。从历史上看,包括Motorola68000系列处理器、Power

c++ - C++中文件的Big Endian和Little Endian

我正在尝试编写一些独立于处理器的代码来以大端格式编写一些文件。我在下面有一个代码示例,但我不明白为什么它不起作用。它应该做的就是让字节按大端顺序将数据的每个字节一个一个地存储起来。在我的实际程序中,我会将单个字节写入文件,因此无论处理器架构如何,我都会在文件中获得相同的字节顺序。#includeintmain(intargc,char*constargv[]){longdata=0x12345678;longbitmask=(0xFF出于某种原因,byte的值始终为0。这让我感到困惑,我正在查看调试器并看到:数据=00010010001101000101011001111000位掩码=

c++ - C++ 模板如何专用于所有 32 位 POD 类型?

我开发了一个简单的模板函数来交换单个字段的字节顺序:templateinlinevoidSwapEndian(T&ptr){char*bytes=reinterpret_cast(&ptr);inta=sizeof(T)/2;while(a--){chartmp=bytes[a];intb=sizeof(T)-1-a;bytes[a]=bytes[b];bytes[b]=tmp;}}我经常在T=int或float的地方使用它。这两种类型在目标平台上均由4个字节表示,并且可以由模板的相同特化处理。因为这个函数有时负责处理大缓冲区的原始数据,所以我创建了一个优化的特化:templatein

c++ - 如何在 C++ 中获取 char 的整数值?

我想将存储在32位unsignedint中的值放入四个字符中,然后将每个字符的整数值存储在一个字符串中。我认为第一部分是这样的:chara=orig 最佳答案 如果你真的想先提取单个字节:unsignedchara=orig&0xff;unsignedcharb=(orig>>8)&0xff;unsignedcharc=(orig>>16)&0xff;unsignedchard=(orig>>24)&0xff;或者:unsignedchar*chars=(unsignedchar*)(&orig);unsignedchara=cha

c++ - 交换 float 和 double 的 "endianness"

我想切换float和double值的“字节顺序”,它可以正常工作,方法如下:floatconstv{1.f};swap(reinterpret_cast(v));是否有更好的方式来进行交换,无需强制转换?编辑:swap()是gcc内置函数的C++包装器,我没有在此处包含它。uint16_t__builtin_bswap16(uint16_tx)uint32_t__builtin_bswap32(uint32_tx)uint64_t__builtin_bswap64(uint64_tx)某些数据格式需要字节顺序交换,例如CBOR。 最佳答案