C++ 字节与数组交换?

C++ 字节与数组交换?,c++,endianness,C++,Endianness,首先,请原谅我非常业余的编码知识。 我是一家公司的实习生,被分配创建一个C++代码,交换字节以获得正确的校验和值。 我正在阅读一份类似以下内容的清单: S315FFF200207F7FFFFF42A0000000000001B000000647C S315FFF2003041A00000FF7FFF0000001B00000064ED S315FFF2004042480000FF7FFFFF0000001E000000464F 我已经让程序将这个字符串转换为十六进制,然后再转换为int,这样就可

首先,请原谅我非常业余的编码知识。 我是一家公司的实习生,被分配创建一个C++代码,交换字节以获得正确的校验和值。 我正在阅读一份类似以下内容的清单: S315FFF200207F7FFFFF42A0000000000001B000000647C S315FFF2003041A00000FF7FFF0000001B00000064ED S315FFF2004042480000FF7FFFFF0000001E000000464F

我已经让程序将这个字符串转换为十六进制,然后再转换为int,这样就可以正确地读取它。我不是在读每行的前12个字符或最后2个字符

我的问题是如何使转换后的int进行字节交换(从小端到大端),以便计算机可读? 如果这是一个糟糕的解释,我再次感到抱歉

编辑:我需要基本上采取每个字节(4个字母)和翻转他们。i、 e:64C7换成了C764,等等。我该怎么做并把它放到一个新的阵列中呢?现在每一行都是一个字符串

EDIT2:这是我现在代码的一部分

    int j = 12;

                    for (i = 0; i < hexLength2 - 5; i++){

                        string convert1 = ODL.substr(j, 4);

                        short input_int = stoi(convert1);
                        short lowBit = 0x00FF & input_int;
                        short hiBit = 0xFF00 & input_int;

                        short byteSwap = (lowBit << 8) | (hiBit >> 8);
intj=12;
对于(i=0;i8);
我想我可能需要在某种程度上把我的STOI转换成short

编辑3:使用下面的答案代码,我得到了以下结果。。。 十六进制:8D-->在字节交换时以141(十进制)的形式存储到内存(myMem=无符号短)中:-29440 这里怎么了

            for (i = 0; i < hexLength2 - 5; i++){

                        string convert1 = ODL.substr(j, 2);
                        stringstream str1;
                        str1 << convert1;
                        str1 >> hex >> myMem[k];

                        short input_int = myMem[k];                     //byte swap 
                        short lowBit = 0x00FF & input_int;              
                        short hiBit = 0xFF00 & input_int;               
                        short byteSwap = (lowBit << 8) | (hiBit >> 8);  
                        cout << input_int << endl << "BYTE SWAP: " <<byteSwap <<"Byte Swap End" << endl;    
                        k++;
                        j += 2;
for(i=0;ihex>>myMem[k];
短输入_int=myMem[k];//字节交换
短低位=0x00FF&input\u int;
短hiBit=0xFF00&input\u int;
短字节wap=(低位>8);

如果你问的是我认为你在问的问题-

首先,您需要确保知道整数的大小。32位是很好的标准位,但请检查并确保

第二,将整数数组转换为字符数组。现在您可以一次访问和操作一个字节的数组


第三个-只需颠倒每四个字节的顺序(在第一个12字符偏移量之后)。交换第一个和第四个以及第二个和第三个。

您也可以按位进行。(假设为16位字)例如,如果您是字节交换int:

short input_int = 123; // each of the ints that you have

short input_lower_half = 0x00FF & input_int;
short input_upper_half = 0xFF00 & input_int;

// size of short is 16-bits, so shift the bits halfway in each direction that they were originally
 short byte_swapped_int = (input_lower_half << 8) | (input_upper_half >> 8)
short input\u int=123;//您拥有的每个int
短输入下半部分=0x00FF&input\U int;
短输入上半部分=0xFF00&input int;
//short的大小是16位,所以在每个方向上将位移动到原来的一半
短字节交换的整数=(输入下半部分>8)
编辑:我使用您的代码的确切尝试

unsigned short myMem[20];
int k = 0;
string ODL = "S315FFF2000000008DC7000036B400003030303030319A";

int j = 12;
for(int i = 0; i < (ODL.length()-12)/4; i++) { // not exactly sure what your loop condition was

    string convert1 = ODL.substr(j, 4);
    cout << "substring is: " << convert1 << endl;
    stringstream str1;
    str1 << convert1;
    str1 >> hex >> myMem[k];

    short input_int = myMem[k];                     //byte swap
    unsigned short lowBit = 0x00FF & input_int; // changed this to unsigned
    unsigned short hiBit = 0xFF00 & input_int; // changed this to unsigned
    short byteSwap = (lowBit << 8) | (hiBit >> 8);
    cout << hex << input_int << " BYTE SWAPed as: " << byteSwap <<", Byte Swap End" << endl;
    k++;
    j += 4;
}
unsigned short myMem[20];
int k=0;
字符串ODL=“S315FFF2000000008DC700036B40000303030319A”;
int j=12;
对于(inti=0;i<(ODL.length()-12)/4;i++){//不完全确定循环条件是什么
字符串convert1=ODL.substr(j,4);
coutmymem[k];
短输入_int=myMem[k];//字节交换
unsigned short lowBit=0x00FF&input_int;//将其更改为unsigned
unsigned short hiBit=0xFF00&input_int;//将其更改为unsigned
短字节wap=(低位>8);

您是否需要指定字节交换的字长,例如2字节、4字节或其他字长。我相信是每2字节一次……当然有很多现有资源可以教您如何在数组中交换字节?我找到了_byteswap_ushort函数,但不知道如何正确使用它。我是一名电气工程专业的学生我做了一个软件工程师的工作,我在这个实习之前只使用了1个C++类,这看起来像是标准的摩托罗拉的记录HEX文件——在这个格式和二进制之间应该有大量的代码例子来读写。但是,这只是一个常数int,对吗?我必须在T中读取和交换每一行。他记录。这不仅适用于常量整数,你也可以将其用于非常量整数。所有这一切都可以在一个整数中读取,而不管它是否是常量。是的,这只适用于一个整数,但你说你使用了字符串->十六进制->整数,所以如果你使用这种方法,你会循环所有整数,这样做是f或者全部。当我转换时,我将它们存储在内存中(myMem[j]),那么这是我的输入吗?或者我应该创建另一个变量,将原始记录字符串转换为int并使用它吗?这不是进行endian交换,而是交换低16位和高16位。@mattnewport你是对的,这不是我需要做的,lol我需要基本上取每个字(2个字母)然后把它们翻过来,也就是说:C7翻到7C,等等。