1. 程式人生 > >8進位制字串轉16進位制字串(二)

8進位制字串轉16進位制字串(二)

//寫一個函式實現8進位制字串到16進位制字串的轉換
//例如:
//輸入"755"結果是"1ED"
//輸入"777777777777"結果是"FFFFFFFFF" (注意超過了32位)

//答案2
//使用位段定義
#include <iostream.h>
#include <string.h>

struct tagDataForOctal
{
	unsigned int n3Bit1:3;   //表示一位8進位制數
	unsigned int n3Bit2:3; 
	unsigned int n3Bit3:3; 
	unsigned int n3Bit4:3; 
};

struct tagDataForHex
{
	unsigned int n4Bit1:4;   //表示一位16進位制數
	unsigned int n4Bit2:4;
	unsigned int n4Bit3:4;
};

//8進位制字串轉16進位制字串
//注:要保證pHexStr指向記憶體空間的長度
bool ConvertOctalStrToHexStr(const char* pOctalStr, char* pHexStr)
{
	//檢查
	if (pOctalStr == NULL || pHexStr == NULL)
	{
		return false;
	}
	
	int nCount = 0;
	//獲取8進位制字串的長度
	int nLength = strlen(pOctalStr);
	if (nLength % 4 == 0)
	{
		nCount = nLength/4;
	}
	else
	{
		nCount = nLength/4 + 1;
	}
	
	//申請記憶體空間
	char* pszOctalBuffer = new char[nCount*4];
	if (pszOctalBuffer == NULL)
	{
		return false;
	}
	memset(pszOctalBuffer, 0, nCount*4);

	//755 -> 5570
	for (int i = 0; i < nLength; i++)
	{
		pszOctalBuffer[i] = pOctalStr[nLength - 1 -i];
	}

	char* pszHexBuffer = new char[nCount*3];
	if (pszHexBuffer == NULL)
	{
		return false;
	}
	memset(pszHexBuffer, 0, nCount*3);

	int nIndex = 0;
	tagDataForOctal DataForOctal;
	tagDataForHex*   pDataForHex = NULL;
	for (i = 0; i < nCount*4; i+=4)
	{
		//清零
		DataForOctal.n3Bit1 = 0;
		DataForOctal.n3Bit2 = 0;
		DataForOctal.n3Bit3 = 0;
		DataForOctal.n3Bit4 = 0;

		//給DataForOctal結構體賦值
		if (pszOctalBuffer[i] != 0 && pszOctalBuffer[i] < '0' || pszOctalBuffer[i] > '7')
		{
			return false;
		}
		else if (pszOctalBuffer[i] != 0)
		{
			DataForOctal.n3Bit1 = pszOctalBuffer[i] - 48;
		}

		if (pszOctalBuffer[i+1] != 0 && pszOctalBuffer[i+1] < '0' || pszOctalBuffer[i+1] > '7')
		{
			return false;
		}
		else if (pszOctalBuffer[i+1] != 0)
		{
			DataForOctal.n3Bit2 = pszOctalBuffer[i+1] - 48;
		}

		if (pszOctalBuffer[i+2] != 0 && pszOctalBuffer[i+2] < '0' || pszOctalBuffer[i+2] > '7')
		{
			return false;
		}
		else if (pszOctalBuffer[i+2] != 0)
		{
			DataForOctal.n3Bit3 = pszOctalBuffer[i+2] - 48;
		}

		if (pszOctalBuffer[i+3] != 0 && pszOctalBuffer[i+3] < '0' || pszOctalBuffer[i+3] > '7')
		{
			return false;
		}
		else if (pszOctalBuffer[i+3] != 0 )
		{
			DataForOctal.n3Bit4 = pszOctalBuffer[i+3] - 48;
		}

		//指標型別的轉換
		pDataForHex = (tagDataForHex*)&DataForOctal;
	
		nIndex = i/4;
		if (pDataForHex->n4Bit1 >= 0 && pDataForHex->n4Bit1 <= 9)
		{
			pszHexBuffer[nIndex*3] = pDataForHex->n4Bit1 + 48; 
		}
		else if (pDataForHex->n4Bit1 >= 10 && pDataForHex->n4Bit1 <= 15)
		{
			pszHexBuffer[nIndex*3] = pDataForHex->n4Bit1 + 55;
		}
		
		if (pDataForHex->n4Bit2 >= 0 && pDataForHex->n4Bit2 <= 9)
		{
			pszHexBuffer[nIndex*3+1] = pDataForHex->n4Bit2 + 48; 
		}
		else if (pDataForHex->n4Bit2 >= 10 && pDataForHex->n4Bit2 <= 15)
		{
			pszHexBuffer[nIndex*3+1] = pDataForHex->n4Bit2 + 55;
		}

		if (pDataForHex->n4Bit3 >= 0 && pDataForHex->n4Bit3 <= 9)
		{
			pszHexBuffer[nIndex*3+2] = pDataForHex->n4Bit3 + 48; 
		}
		else if (pDataForHex->n4Bit3 >= 10 && pDataForHex->n4Bit3 <= 15)
		{
			pszHexBuffer[nIndex*3+2] = pDataForHex->n4Bit3 + 55;
		}

	}

	//轉換
	for (int j = 0; j < nCount*3; j++)
	{
		pHexStr[j] =  pszHexBuffer[nCount*3 -1 - j];
	}

	//沒考慮16進位制字串最高位為0的情況 340 ->0E0  0得去掉

	//釋放記憶體空間
	if (pszOctalBuffer != NULL)
	{
		delete[] pszOctalBuffer;
		pszOctalBuffer = NULL;
	}

	if (pszHexBuffer != NULL)
	{
		delete[] pszHexBuffer;
		pszHexBuffer = NULL;
	}

	return true;
}


int main(int argc, char* argv[])
{
	char *pszOCtrl = "340";   //結果 E0
	//char *pszOCtrl = "555";
	//char *pszOCtrl = "755";
	//char *pszOCtrl = "777777777777";
	char szHexBuffer[12] = {0};

	if (ConvertOctalStrToHexStr(pszOCtrl, szHexBuffer) == false)
	{
		printf("Convert false");
	}
	else
	{
		printf("%s\r\n", szHexBuffer);
	}

	return 0;
}

相關推薦

8字串16字串

//寫一個函式實現8進位制字串到16進位制字串的轉換 //例如: //輸入"755"結果是"1ED" //輸入"777777777777"結果是"FFFFFFFFF" (注意超過了32位) //答案2 //使用位段定義 #include <iostream.h>

c語言-10字串16字串

程式碼: #include <stdio.h> #include <string.h> #include <malloc.h> char *DecToHex(char *pHex,char *pDec,int Declen) { int

Java字串16 工具類Hex.java

Java 字串轉 16 進位制工具類 Hex.java 實現 16進位制 0xfecd .. 和 java 字串之間的互轉換! 如果做開發,通常使用者登陸,網路請求可能會用 mad5(salt + pwd) 然後再將 md 之後的資料 hex 一下。 這個工具類,就是實現

16字串16數字

int tolower(int c) { if ((c >= 'A') && (c <= 'Z')) return c + ('a' - 'A'); return c; } int htoi(char s[]) { int i; i

python 字串16數字

1 原始檔案中的字串2 讀取檔案字串從檔案中讀取2個位元組,程式碼如下:def print_hex_str(str1):    print len(str1)    print str1    print int(str1, 16)    for i in str1:   

java 字串16包含漢字

public static String toChineseHex(String s) { String ss = s; byte[] bt = new byte[0]; tr

C#階系列——MEF實現設計上的“鬆耦合”

前言:前篇 C#進階系列——MEF實現設計上的“鬆耦合”(一) 介紹了下MEF的基礎用法,讓我們對MEF有了一個抽象的認識。當然MEF的用法可能不限於此,比如MEF的目錄服務、目錄篩選、重組部件等高階應用在這裡就不做過多講解,因為博主覺得這些用法只有在某些特定的環境下面才會用到,著實不太普遍,感覺沒有鑽下去的

】VBA編程入門

mat 復雜 任務 遙控 一次 環境 box range 使用 詳解VBA編程是什麽 由 vietdung90 創建,最後一次修改 2016-10-19 直到 90 年代早期,使應用程序自動化還是充滿挑戰性的領域.對每個需要自動化的應用程序,人們不得不學習一種不

[]numpy的函數使用:np.tile()

[] 而且 什麽 得出 基本數據類型 技術分享 圖片 理解 log 一、tile函數 1.函數的定義與說明 tile函數是模板numpy.lib.shape_base中的函數。 函數的形式是tile(A,reps) 函數參數說明中提到A和reps都是array_like的,

day 16 - 1 內建函式

內建函式(二) reversed()  返回一個反向的迭代器 k = [1,2,3,4,5] k.reverse() #反轉 print(k) k = [1,2,3,4,5] k2 = reversed(k) #反向的迭代器 print(k2) for i in k2: pri

day 16 - 2 內建函式練習

內建函式(二)練習 1、用map來處理字串列表,把列表中所有人都變成sb,比方alex_sbname=['alex','wupeiqi','yuanhao','nezha']   name=['alex','wupeiqi','yuanhao','nezha'] def func(n):

:QT實現陰影視窗

從上一篇的效果可以看到視窗並不美觀,而且不能用滑鼠進行拖動,還不可以實現最大最小化。       要實現用滑鼠拖動可以,過載滑鼠點選和滑鼠移動事件的處理,具體如下:      //GraphicDialog.h      protected:           void

char/byte陣列16字串

// ConsoleApplication1.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { unsigned char char0xFF[16]

字串Ascll格式16

之前做過一些專案需要用到ASCLL碼轉換到16進位制,在網上搜索後發現,大部分都是10進位制數字轉16進位制資料,這對於8位字元型別unsignal char (這裡不用char,因為char是-127到128,對於129-255之間的數溢位變為負數,算起

PHP之字串16ASCII互

 //PHP中可以通過bin2hex函式將字串轉換成16進位制的形式輸出,bin2hex()函式返回結果為ascii碼 $string = "cfg_power"; $arr1 = str_spl

水題T,二進位制16

輸入一個2進位制的數,要求輸出該2進位制數的16進製表示。 在16進位制的表示中,A-F表示10-15 Input第1行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔1行,包括一個以0和1組成的字串,字串長度至少是1,至多是10000Outputn行,每行輸出對應一個輸入。Sampl

藍橋杯演算法題庫 轉換_十進位制16

藍橋杯演算法題庫 十進位制轉16進位制 題目 解題思路 題目 問題描述 十六進位制數是在程式設計時經常要使用到的一種整數的表示方式。 它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符號,分別表

php 二進位制16 大數

//轉16進位制 <?php $mybit = '00100000010000000100011111001111001010110101100000010000101110011100011

DICOM檔案16

話不多說直接上程式碼 package com.cn; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;

android開發中遇到的轉換,16資料流轉和字串的相互轉換

最近開發的程式是利用無線網路,收發資料,其中,接收和傳送的格式是16進位制位元組陣列 byte[],而顯示到介面中則不可能把一堆的位元組流顯示出來。因此,需要進行一下轉換。  直接說轉換的演算法吧        一、16進位制位元組陣列轉換成字串 核心的語句就一句getSt