字节交换与数组?

时间:2015-09-14 21:04:25

标签: c++ endianness

首先,原谅我非常业余的编码知识。 我在一家公司实习,并被指派用C ++创建一个交换字节的代码,以获得正确的校验和值。

我正在阅读类似于以下内容的列表: S315FFF200207F7FFFFF42A000000000001B000000647C S315FFF2003041A00000FF7FFFFF0000001B00000064ED S315FFF2004042480000FF7FFFFF0000001E000000464F

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

我的问题是如何让转换后的int做一个字节交换(小端到大端),以便它对计算机可读? 如果这是一个可怕的解释,我很抱歉。

编辑:我需要基本上取每个字节(4个字母)并翻转它们。即: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);

我想我可能需要以某种方式将我的STOI转换为短片。

EDIT3:使用下面的答案代码,我得到以下内容...... HEX:8D - &gt;存储到内存(myMem = unsigned short)为141(十进制) - &gt;当字节交换时:-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;

2 个答案:

答案 0 :(得分:1)

如果你问我认为你在问什么 -

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

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

第三 - 只需反转每四个字节的顺序(在前12个字符偏移之后)。交换第一和第四,第二和第三。

答案 1 :(得分:1)

你也可以按位进行。 (假设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)

编辑:我确实尝试使用您的代码

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;
}

唯一重要的是将loBit和hiBit更改为无符号,因为这些是我们正在使用的临时值。