mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 05:38:26 +00:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4599 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			244 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/**@file
 | 
						|
  Copyright (c) 2007, Intel Corporation
 | 
						|
 | 
						|
  All rights reserved. This program and the accompanying materials
 | 
						|
  are licensed and made available under the terms and conditions of the BSD License
 | 
						|
  which accompanies this distribution.  The full text of the license may be found at
 | 
						|
  http://opensource.org/licenses/bsd-license.php
 | 
						|
 | 
						|
  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | 
						|
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include "Setup.h"
 | 
						|
 | 
						|
CHAR16
 | 
						|
NibbleToHexChar (
 | 
						|
  IN UINT8      Nibble
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Converts the low nibble of a byte  to hex unicode character.
 | 
						|
 | 
						|
  Arguments:
 | 
						|
    Nibble - lower nibble of a byte.
 | 
						|
 | 
						|
  Returns:
 | 
						|
    Hex unicode character.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  Nibble &= 0x0F;
 | 
						|
  if (Nibble <= 0x9) {
 | 
						|
    return (CHAR16)(Nibble + L'0');
 | 
						|
  }
 | 
						|
 | 
						|
  return (CHAR16)(Nibble - 0xA + L'A');
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Converts binary buffer to Unicode string.
 | 
						|
  At a minimum, any blob of data could be represented as a hex string.
 | 
						|
 | 
						|
  @param  Str                    Pointer to the string.
 | 
						|
  @param  HexStringBufferLength  Length in bytes of buffer to hold the hex string.
 | 
						|
                                 Includes tailing '\0' character. If routine return
 | 
						|
                                 with EFI_SUCCESS, containing length of hex string
 | 
						|
                                 buffer. If routine return with
 | 
						|
                                 EFI_BUFFER_TOO_SMALL, containg length of hex
 | 
						|
                                 string buffer desired.
 | 
						|
  @param  Buf                    Buffer to be converted from.
 | 
						|
  @param  Len                    Length in bytes of the buffer to be converted.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            Routine success.
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL   The hex string buffer is too small.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
R8_BufToHexString (
 | 
						|
  IN OUT CHAR16                    *Str,
 | 
						|
  IN OUT UINTN                     *HexStringBufferLength,
 | 
						|
  IN     UINT8                     *Buf,
 | 
						|
  IN     UINTN                      Len
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete.
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
  UINTN       Idx;
 | 
						|
  UINT8       Byte;
 | 
						|
  UINTN       StrLen;
 | 
						|
 | 
						|
  //
 | 
						|
  // Make sure string is either passed or allocate enough.
 | 
						|
  // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.
 | 
						|
  // Plus the Unicode termination character.
 | 
						|
  //
 | 
						|
  StrLen = Len * 2;
 | 
						|
  if (StrLen > ((*HexStringBufferLength) - 1)) {
 | 
						|
    *HexStringBufferLength = StrLen + 1;
 | 
						|
    return EFI_BUFFER_TOO_SMALL;
 | 
						|
  }
 | 
						|
 | 
						|
  *HexStringBufferLength = StrLen + 1;
 | 
						|
  //
 | 
						|
  // Ends the string.
 | 
						|
  //
 | 
						|
  Str[StrLen] = L'\0';
 | 
						|
 | 
						|
  for (Idx = 0; Idx < Len; Idx++) {
 | 
						|
 | 
						|
    Byte = Buf[Idx];
 | 
						|
    Str[StrLen - 1 - Idx * 2] = NibbleToHexChar (Byte);
 | 
						|
    Str[StrLen - 2 - Idx * 2] = NibbleToHexChar ((UINT8)(Byte >> 4));
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Converts Unicode string to binary buffer.
 | 
						|
  The conversion may be partial.
 | 
						|
  The first character in the string that is not hex digit stops the conversion.
 | 
						|
  At a minimum, any blob of data could be represented as a hex string.
 | 
						|
 | 
						|
  @param  Buf                    Pointer to buffer that receives the data.
 | 
						|
  @param  Len                    Length in bytes of the buffer to hold converted
 | 
						|
                                 data. If routine return with EFI_SUCCESS,
 | 
						|
                                 containing length of converted data. If routine
 | 
						|
                                 return with EFI_BUFFER_TOO_SMALL, containg length
 | 
						|
                                 of buffer desired.
 | 
						|
  @param  Str                    String to be converted from.
 | 
						|
  @param  ConvertedStrLen        Length of the Hex String consumed.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            Routine Success.
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL   The buffer is too small to hold converted data.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
R8_HexStringToBuf (
 | 
						|
  IN OUT UINT8                     *Buf,
 | 
						|
  IN OUT UINTN                    *Len,
 | 
						|
  IN     CHAR16                    *Str,
 | 
						|
  OUT    UINTN                     *ConvertedStrLen  OPTIONAL
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete.
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
 | 
						|
  UINTN       HexCnt;
 | 
						|
  UINTN       Idx;
 | 
						|
  UINTN       BufferLength;
 | 
						|
  UINT8       Digit;
 | 
						|
  UINT8       Byte;
 | 
						|
 | 
						|
  //
 | 
						|
  // Find out how many hex characters the string has.
 | 
						|
  //
 | 
						|
  for (Idx = 0, HexCnt = 0; R8_IsHexDigit (&Digit, Str[Idx]); Idx++, HexCnt++);
 | 
						|
 | 
						|
  if (HexCnt == 0) {
 | 
						|
    *Len = 0;
 | 
						|
    return EFI_SUCCESS;
 | 
						|
  }
 | 
						|
  //
 | 
						|
  // Two Unicode characters make up 1 buffer byte. Round up.
 | 
						|
  //
 | 
						|
  BufferLength = (HexCnt + 1) / 2;
 | 
						|
 | 
						|
  //
 | 
						|
  // Test if  buffer is passed enough.
 | 
						|
  //
 | 
						|
  if (BufferLength > (*Len)) {
 | 
						|
    *Len = BufferLength;
 | 
						|
    return EFI_BUFFER_TOO_SMALL;
 | 
						|
  }
 | 
						|
 | 
						|
  *Len = BufferLength;
 | 
						|
 | 
						|
  for (Idx = 0; Idx < HexCnt; Idx++) {
 | 
						|
 | 
						|
    R8_IsHexDigit (&Digit, Str[HexCnt - 1 - Idx]);
 | 
						|
 | 
						|
    //
 | 
						|
    // For odd charaters, write the lower nibble for each buffer byte,
 | 
						|
    // and for even characters, the upper nibble.
 | 
						|
    //
 | 
						|
    if ((Idx & 1) == 0) {
 | 
						|
      Byte = Digit;
 | 
						|
    } else {
 | 
						|
      Byte = Buf[Idx / 2];
 | 
						|
      Byte &= 0x0F;
 | 
						|
      Byte = (UINT8) (Byte | Digit << 4);
 | 
						|
    }
 | 
						|
 | 
						|
    Buf[Idx / 2] = Byte;
 | 
						|
  }
 | 
						|
 | 
						|
  if (ConvertedStrLen != NULL) {
 | 
						|
    *ConvertedStrLen = HexCnt;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Determines if a Unicode character is a hexadecimal digit.
 | 
						|
  The test is case insensitive.
 | 
						|
 | 
						|
  @param  Digit                  Pointer to byte that receives the value of the hex
 | 
						|
                                 character.
 | 
						|
  @param  Char                   Unicode character to test.
 | 
						|
 | 
						|
  @retval TRUE                   If the character is a hexadecimal digit.
 | 
						|
  @retval FALSE                  Otherwise.
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
R8_IsHexDigit (
 | 
						|
  OUT UINT8      *Digit,
 | 
						|
  IN  CHAR16      Char
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete.
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
 | 
						|
  if ((Char >= L'0') && (Char <= L'9')) {
 | 
						|
    *Digit = (UINT8) (Char - L'0');
 | 
						|
    return TRUE;
 | 
						|
  }
 | 
						|
 | 
						|
  if ((Char >= L'A') && (Char <= L'F')) {
 | 
						|
    *Digit = (UINT8) (Char - L'A' + 0x0A);
 | 
						|
    return TRUE;
 | 
						|
  }
 | 
						|
 | 
						|
  if ((Char >= L'a') && (Char <= L'f')) {
 | 
						|
    *Digit = (UINT8) (Char - L'a' + 0x0A);
 | 
						|
    return TRUE;
 | 
						|
  }
 | 
						|
 | 
						|
  return FALSE;
 | 
						|
}
 | 
						|
 | 
						|
 |