位元組字串互轉
阿新 • • 發佈:2018-12-12
#include <iostream> #include <stdlib.h> #include <string.h> #include <math.h> #include "TestVerb.h" using namespace std; #define STARTWITH true #define MEDIAN false #define STRINGVALUE true #define INTVALUE false // 位元組資料轉換為可列印字串 // 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01" // 輸入: pSrc - 源資料指標 // nSrcLength - 源資料長度 // 輸出: pDst - 目標字串指標 // 返回: 目標字串長度 int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength) { const char tab[] = "0123456789ABCDEF"; // 0x0-0xf的字元查詢表 for (int i = 0; i < nSrcLength; i++) { *pDst++ = tab[*pSrc >> 4]; // 輸出高4位 *pDst++ = tab[*pSrc & 0x0f]; // 輸出低4位 pSrc++; } // 輸出字串加個結束符 *pDst = '\0'; // 返回目標字串長度 return (nSrcLength * 2); } // 可列印字串轉換為位元組資料 // 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} // 輸入: pSrc - 源字串指標 // nSrcLength - 源字串長度 // 輸出: pDst - 目標資料指標 // 返回: 目標資料長度 int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength) { for (int i = 0; i < nSrcLength; i += 2) { // 輸出高4位 if ((*pSrc >= '0') && (*pSrc <= '9')) { *pDst = (*pSrc - '0') << 4; } else { *pDst = (*pSrc - 'A' + 10) << 4; } pSrc++; // 輸出低4位 if ((*pSrc >= '0') && (*pSrc <= '9')) { *pDst |= *pSrc - '0'; } else { *pDst |= *pSrc - 'A' + 10; } pSrc++; pDst++; } // 返回目標資料長度 return (nSrcLength / 2); } long readUint32(unsigned char* pDst, int offset) { return (pDst[offset] & 0xffl) | ((pDst[offset + 1] & 0xffl) << 8) | ((pDst[offset + 2] & 0xffl) << 16) | ((pDst[offset + 3] & 0xffl) << 24); } int main(int argc, char* argv[]) { //char intSprint[255] = "C8329BFD0E0199999999";// char intSprint[255] = "73616665010088b2a905e89ee402ada6624b70c186062ea3606999e43081ade216f00b45e2cfca0000000a02010012201f12288f1df66c44237ed688c5c38acedc01bf4887108eca8ba14dbc376571061880ade2042200"; unsigned char outBytes[255] = { 0 }; int szLength = 0; int byLength = 0; int offset = 0; string strReserve = "73616665010088b2a905e89ee402ada6624b70c186062ea3606999e43081ade216f00b45e2cfca0000000a02010012201f12288f1df66c44237ed688c5c38acedc01bf4887108eca8ba14dbc376571061880ade2042200"; string strCommand = strReserve.substr(76, 8); //long i = outBytes[offset] & 0xffl | ((outBytes[offset + 1] & 0xffl) << 8) | ((outBytes[offset + 2] & 0xffl) << 16) | ((outBytes[offset + 3] & 0xffl) << 24); byLength = gsmString2Bytes(intSprint, outBytes, strlen(intSprint)); //unsigned char outTmp[255] = outBytes; //strcpy(outTmp, outBytes); long i = readUint32(outBytes, 38); szLength = gsmBytes2String(outBytes, intSprint, strlen(intSprint) / 2); printf("%s\n", intSprint); return 0; }