草庐IT

endianness

全部标签

c++ - 字节顺序转换 C++

我正在尝试解码从大端机器发送到驻留在小端机器上的解码器的一些数据。我没有太多的工作,我觉得我自己很困惑。我使用bitsets来打印我的数据,这样我就可以准确地看到它是如何针对特定的32位结构输出的,而且我可以看到我需要的数据位于位序列的中间。现在,我知道如果你有一个32位值,要从大到小,你需要颠倒字节顺序。如果我这样做,我的数字不会以我期望的方式结束(手工完成)。所以,例如。我有一个32位无符号整数。我知道它来self的Big-Endian机器0x50000000。当我使用little-endian机器上的位集打印时cout(Data.pack_Spare).to_string()我得

c++ - C/C++ 字节顺序和 tcp 套接字

我有一个关于字节序及其如何影响与C/C++的tcp套接字通信的一般概念性问题。这是一个例子:您有两台服务器与tcp套接字通信,一台使用大端,另一台使用小端。如果您通过套接字从一台服务器向另一台服务器发送一个整数,我知道字节顺序是相反的,整数将不会打印出预期的内容。正确的?我在某个地方看到(我再也找不到哪里了)如果你通过套接字字节顺序发送一个char不会改变值并且它会按预期打印。这个对吗?如果是这样,为什么?我觉得我以前做过这种事,但我可能是错觉了。谁能帮我解决这个问题?谢谢。编辑:是不是因为char只有1个字节? 最佳答案 考虑每种

用于原始文件流元数据的字节序感知读取的 C++ 库?

我有来自图像文件的原始数据流,例如:vectorrawData(fileSize);ifstreaminFile("image.jpg");inFile.read(&rawData[0]);我想解析不同图片格式的header的高度和宽度。是否有可移植的库可以从缓冲区/流中读取int、long、short等,并按照指定的字节序进行转换?我希望能够执行如下操作:shortx=rawData.readLeShort(offset);或longy=rawData.readBeLong(offset)更好的选择是可以处理原始图像数据的轻量级和可移植图像元数据库(没有图像处理库的额外重量)。我发现

c++ - 环回抓包

此代码在Ubuntu16.04上运行良好,并在我通过环回接口(interface)处理UDP字节时打印正确的值(ETHERTYPE_IP):#include#include#includeintmain(intargc,char**argv){charerrbuf[PCAP_ERRBUF_SIZE];autopcap=pcap_open_live("lo0",BUFSIZ,0,1000,errbuf);pcap_loop(pcap,0,[](u_char*self,conststructpcap_pkthdr*header,constu_char*packet){autoeth=(st

c++ - Raspberry Pi 上的字节顺序问题

我刚刚开始使用C++进行一些原始网络编程,并一直在我的RaspberryPi本身上进行编译(没有交叉编译)。这使得一切都是小端。构建我的IPheader后,我计算了IP校验和,但结果总是不正确(基于此处的示例http://www.thegeekstuff.com/2012/05/ip-header-checksum/)。加速gdb,我将我的问题细化到IPheader中前32位的排序。该示例使用0x4500003C,表示版本4(0x4)、IHL5(0x5)、TOS0(0x00>)和tot_length60(0x003C)。所以我设置了相同的数据包。structiphdr*ip;//Als

c++ - 将二进制值转换为浮点值的计算器——我做错了什么?

我有以下代码,它以二进制形式将6个float写入磁盘并读回:#include#includeintmain(){intnumSegs=2;intnumVars=3;float*data=newfloat[numSegs*numVars];for(inti=0;i输出:00.230.460.690.921.1500.230.460.690.921.15当我在hexer中加载文件时,我们得到:000000001f856b3e1f85eb3ed7a3303f1f856b3f3333933f----------------我想直接从小数计算浮点值。例如:1f856b3e变为0.23,1f85e

c++ - 如何字节交换一个双?

我正在尝试为在WinXP上运行的C++程序编写字节交换例程。我正在使用VisualStudio2008进行编译。这就是我想出的:intbyteswap(intv)//Thisisgood{return_byteswap_ulong(v);}doublebyteswap(doublev)//Thisdoesn'tworkforsomevalues{union{//ThistrickisfirstusedinQuake2sourceIbelieve:D__int64i;doubled;}conv;conv.d=v;conv.i=_byteswap_uint64(conv.i);return

c++ - 从 char* 缓冲区读取 int32_t 的惯用 cpp14 方法是什么?

给定一个包含int(小端)的字符缓冲区c。如何读作int32_t?我写了这段代码,但感觉不符合cpp的习惯。int32_tv;char*p=(char*)&v;for(inti=0;i 最佳答案 将binary数据从char*缓冲区复制到任何其他数据类型的唯一可移植方法是使用memcpy(或等效字节-copyingmerhodsuchasstd::copy或你自己的模仿这种行为的方法)。memcpy(&my_number,my_buffer,sizeof(my_number));当然,缓冲区应该包含给定数据类型的正确位。如果它源于在

c++ - 为什么 std::bitset 以小端方式公开位?

当我使用std::bitset::bitset(unsignedlonglong)时这构建了一个位集,当我通过operator[]访问它时,这些位似乎以小端方式排序。示例:std::bitsetb(3ULL);std::cout打印1100而不是0011即结尾(或LSB)位于小(低)地址,索引0。查找标准,它说initializingthefirstMbitpositionstothecorrespondingbitvaluesinval程序员自然会想到从LSB到MSB(从右到左)的二进制数字。因此,前M位位置可以理解为LSB→MSB,因此位0将位于b[0]。.然而,在不断变化的情况下

ios - 在 Swift 中将 float 转换为 little endian

我正在处理来自套接字的数据并成功地将数据转换为Int和Floats:letfloat=data.withUnsafeBytes{$0.pointee}asFloat一切正常,直到一部iPhone6Plus似乎在使用BigEndian处理数据。我可以毫不费力地转换Int:letuint32=UInt32(littleEndian:data.withUnsafeBytes{$0.pointee})letint=Int(uint32)不幸的是,我似乎无法弄清楚如何转换float据。 最佳答案 一种可能的解决方案是先将数据读入一个32位整数