diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/ConvertToCharAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/ConvertToCharAction.java index f0810376b5..d6e3055beb 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/ConvertToCharAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/ConvertToCharAction.java @@ -20,7 +20,6 @@ import ghidra.program.model.data.ByteDataType; import ghidra.program.model.data.StringDataInstance; import ghidra.program.model.listing.Program; import ghidra.program.model.scalar.Scalar; -import utilities.util.ArrayUtilities; public class ConvertToCharAction extends AbstractConvertAction { public static final String ACTION_NAME = "Convert To Char"; @@ -49,10 +48,6 @@ public class ConvertToCharAction extends AbstractConvertAction { @Override protected String convertToString(Program program, Scalar scalar, boolean isData) { byte[] bytes = scalar.byteArrayValue(); - boolean isLE = !program.getMemory().isBigEndian(); - if (isLE) { - bytes = ArrayUtilities.reverse(bytes); - } return StringDataInstance.getCharRepresentation(ByteDataType.dataType, bytes, null); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java index da9c4a8f0d..c29863199a 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java @@ -21,6 +21,7 @@ import ghidra.docking.settings.*; import ghidra.program.model.mem.MemBuffer; import ghidra.program.model.scalar.Scalar; import ghidra.util.StringFormat; +import utilities.util.ArrayUtilities; /** * Base type for integer data types such as {@link CharDataType chars}, {@link IntegerDataType ints}, @@ -224,32 +225,29 @@ public abstract class AbstractIntegerDataType extends BuiltIn implements ArraySt return "??"; } + boolean isLE = !ENDIAN.isBigEndian(settings, buf); + if (isLE) { + bytes = ArrayUtilities.reverse(bytes); + } + if (getFormatSettingsDefinition().getFormat(settings) == FormatSettingsDefinition.CHAR) { return StringDataInstance.getCharRepresentation(this, bytes, settings); } - boolean isBigEndian = ENDIAN.isBigEndian(settings, buf); - - if (!isBigEndian) { - byte[] flipped = new byte[size]; - for (int i = 0; i < size; i++) { - flipped[i] = bytes[size - i - 1]; - } - bytes = flipped; - } - - return getRepresentation(new BigInteger(bytes), settings, 8 * length); } /** * Get integer representation of the big-endian value. + *

+ * Does not handle CHAR format, use {@link StringDataInstance#getCharRepresentation(DataType, byte[], Settings)} + * * @param bigInt BigInteger value with the appropriate sign * @param settings integer format settings (PADDING, FORMAT, etc.) * @param bitLength number of value bits to be used from bigInt * @return formatted integer string */ - public String getRepresentation(BigInteger bigInt, Settings settings, int bitLength) { + /*package*/ String getRepresentation(BigInteger bigInt, Settings settings, int bitLength) { int format = getFormatSettingsDefinition().getFormat(settings); boolean padded = PADDING.isPadded(settings); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BitFieldDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BitFieldDataType.java index bc900798aa..4ca59ed2d6 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BitFieldDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BitFieldDataType.java @@ -17,11 +17,12 @@ package ghidra.program.model.data; import java.math.BigInteger; -import ghidra.docking.settings.Settings; -import ghidra.docking.settings.SettingsDefinition; +import ghidra.docking.settings.*; import ghidra.program.model.mem.MemBuffer; import ghidra.program.model.scalar.Scalar; +import ghidra.util.DataConverter; import ghidra.util.exception.AssertException; +import utilities.util.ArrayUtilities; /** * BitFieldDataType provides a means of defining a minimally sized bit-field @@ -406,7 +407,20 @@ public class BitFieldDataType extends AbstractDataType { if (dt instanceof Enum) { return ((Enum) dt).getRepresentation(big, settings, effectiveBitSize); } - return ((AbstractIntegerDataType) dt).getRepresentation(big, settings, effectiveBitSize); + AbstractIntegerDataType intDT = (AbstractIntegerDataType) dt; + if (intDT.getFormatSettingsDefinition().getFormat( + settings) == FormatSettingsDefinition.CHAR) { + int bytesLen = BitFieldDataType.getMinimumStorageSize(bitSize); + byte[] bytes = DataConverter.getInstance(getDataOrganization().isBigEndian()).getBytes( + big, bytesLen); + if (!EndianSettingsDefinition.ENDIAN.isBigEndian(settings, buf)) { + bytes = ArrayUtilities.reverse(bytes); + } + + return StringDataInstance.getCharRepresentation(this, bytes, settings); + } + + return intDT.getRepresentation(big, settings, effectiveBitSize); } @Override diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java index b1a4853302..93e246eea6 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StringDataInstance.java @@ -283,7 +283,7 @@ public class StringDataInstance { if (dataType instanceof AbstractStringDataType) { return ((AbstractStringDataType) dataType).getStringLayout(); } - if (dataType instanceof AbstractIntegerDataType) { + if (dataType instanceof AbstractIntegerDataType || dataType instanceof BitFieldDataType) { return StringLayoutEnum.FIXED_LEN; } return StringLayoutEnum.NULL_TERMINATED_BOUNDED;